2011-05-20 4 views
12

J'ai quelques problèmes en utilisant has_one, through => model. Le mieux est de vous montrer mon cas.has_one,: through => modèle VS méthode simple?

class Category 
    has_many :articles 
end 

class Article 
    has_many :comments 
    belongs_to :category 
end 

class Comment 
    belongs_to :article 
    has_one :category, :through => :articles 
end 

Everthing fonctionne très bien. Je peux faire comment.category. Le problème est lorsque je crée un nouveau commentaire et que je configure son article, j'ai donc enregistré le commentaire pour que l'association fonctionne. Exemple:

>> comment = Comment.new 
>> comment.article = Article.last 
>> comment.category 
    -> nil 
>> comment.article.category 
    -> the category 
>> comment.save 
>> comment.category 
    -> nil 
>> comment.reload 
>> comment.category 
    -> the category 

has_one, through => model de toute façon ne pas mettre en place, construire constructeur et créer méthode. Donc, je veux remplacer mon modèle de commentaire par:

class Comment 
    belongs_to :article 
    def category 
    article.category 
    end 
end 

Cela peut-être une bonne idée?

+0

quelqu'un? personne n'a de bonnes opinions? – Hartator

Répondre

6

Rien de mal à votre idée. Je ne peux pas voir beaucoup de situations dans lesquelles has_one :category, :through => :articles serait le meilleur choix évident (à moins de vouloir charger avec Comment.all(:include => :category)).

Un soupçon sur delegate:

class Comment 
    belongs_to :article 
    delegate :category, :to => :article 

Une approche différente:

class Comment 
    belongs_to :article 
    has_one :category, :through => :article 

    def category_with_delegation 
    new_record? ? article.try(:category) : category_without_delegation 
    end 

    alias_method_chain :category, :delegation 
+0

un peu plus d'informations à 'alias_method_chain' peut être trouvé [ici] (http://yehudakatz.com/2009/03/06/alias_method_chain-in-models/) – jigfox

+0

ok bonne info, abandonnez ma générosité à vous. – Hartator

+0

Je pense que c'est ce que Rails devrait faire par défaut ... Au lieu de toujours interroger la base de données, passez par l'objet déjà en mémoire! – pdobb

2

Essayez de faire des changements dans votre catégorie classe comme ceci:

class Category 
    has_many :articles 
    has_many :comments, :through => :articles 
end 
+0

désolé, l'a mal orthographié sur stakeoverflow. Pas le problème sur ma vraie application. – Hartator

Questions connexes