2010-09-05 6 views
9

Nous prévoyons de mettre à jour notre application à Rails3. Un plugin que nous avons beaucoup utilisé est nested_has_many_through. Ce plugin semble obsolète, n'est plus maintenu et ne semble pas fonctionner dans une nouvelle application Rails3.Rails3 imbriqué has_many à travers la question

Un exemple simple:

Author.rb 
has_many :posts 
has_many :categories, :through => :posts, :uniq => true 
has_many :related_posts, :through => :categories 

Post.rb 
belongs_to :author 
belongs_to :category 

Category.rb 
has_many :posts 

Quelqu'un peut-il recommander la meilleure façon pratique de gérer cela, ou un plugin Rails3 travail?

Merci!

+1

Haha Je viens de trouver ta fourchette http://github.com/releod/nested_has_many_thr Ough et se souvenait de cette question et venait ici pour vous dire tout au sujet de la fourchette. Et puis j'ai vu ton nom d'utilisateur. Bon travail, je viens de le tester sur mon application Rails 3 et ça fonctionne (surtout). J'ai passé toute la nuit à essayer de patcher Rails directement selon https://rails.lighthouseapp.com/projects/8994/tickets/1152-support-for-nested-has_many-through-associations mais je suis coincé. Je vais commencer avec votre fourchette comme modèle, et je pourrais aller plus loin maintenant! –

+0

+1 http://github.com/releod/nested_has_many_avec vos rails3 la fourche fonctionne pour moi aussi, je l'utiliserai jusqu'à ce que les rails 3.1 – clyfe

Répondre

0

Je suis plus confus par la partie has_many: related_posts. Essaies-tu essentiellement de joindre ensemble des posts catégorisés? Par exemple, tous les posts de la catégorie 'x' sont considérés comme 'liés'? Si oui, cela ne fonctionnera pas sur la base d'être là pas une classe RelatedPost, afin de résoudre ce problème à un strict minimum, il faudrait préciser: class_name sur l'association:

has_many :related_posts, :class_name => 'Post', :through => :categories 

Mais d'autre part, il est probablement pas la bonne approche pour commencer. Comme n'importe quel auteur a déjà de nombreux messages via la clé étrangère author_id, il n'y a aucun sens à essayer de revenir dans la table des catégories, à la place, utilisez la logique de regroupement.

autres approches qui nettoient cette place:

Author.rb

has_many :posts do 
    def related 
    all.group_by(&:category_id) 
    end 
end 
author.posts.related 
=> OrderedHash 

Bien sûr, tout cela est sans objet si ce n'était pas ce que vous essayez d'accomplir. : P

+2

Je suis enclin à penser que son exemple est artificiel (donc facilement défectueux). Sa question est toujours fondamentalement importante. Et au meilleur de ma connaissance il n'y a pas une solution de travail pour emboîter a beaucoup de passages dans Rails 3 (à la vieille nested_has_many_through pour Rails <2.3) –

+0

La dernière partie de sa question a mentionné "recommander la meilleure pratique". Mon point était, si votre application l'exige, il y a probablement un meilleur mécanisme pour l'accomplir. ;) Si son exemple est vraiment artificiel, il serait incroyablement utile de voir son code réel. – jenjenut233

+1

Assez juste. Il y a certainement des cas d'utilisation où une imbrication a beaucoup d'association (c'est-à-dire en utilisant plusieurs INNER JOINs, pour les non-Rails folk) est une solution valide, et souvent la meilleure.Étant donné "Auteur - - abonnés> -

0

Rails 3 (non vérifiées, les commandes de messages avec des catégories les plus liées en premier):

category.rb:

class Category < ActiveRecord::Base 
    class << self 
    def posts 
     Post.joins(:categories). 
      where(:categories => select('id').all.map(&:id)). 
      group('posts.id'). 
      order('count(*) DESC') 
    end 
    end 
end 

Utilisation:

related_posts = author.categories.posts