2010-10-14 4 views
3

Par exemple, j'ai un modèle de commentaires, et j'ai un modèle de publication, mais les commentaires peuvent commenter d'autres commentaires.Toutes les tables jointes ont-elles des tables?

Il semble donc que j'ai besoin d'une table de jointure que j'appellerai commentables. Pour créer ceci, ai-je vraiment besoin de créer une table commentable avec un post_id et un comment_id?

Ou puis-je faire quelque chose comme ça sans un:

has_many   :comments, 
        :through => :commentables, 
        :source => :post 

Pas vraiment sûr quelle est la meilleure façon d'y parvenir. Je suis un débutant énorme.

Répondre

5

Non, vous ne devriez pas avoir besoin d'une table de jointure dans ce cas. Les tables jointes sont pour les relations has_and_belongs_to_many, et dans ce cas, vous n'avez pas besoin d'en avoir une (les commentaires ne peuvent pas appartenir à beaucoup de publications, n'est-ce pas?).

Vous avez deux options pour ce faire. La première consiste à créer une relation polymorphes:

class Post < ActiveRecord::Base 
    has_many :comments, :as => :parent 
end 

class Comment < ActiveRecord::Base 
    belongs_to :parent, :polymorphic => true 
    has_many :children, :class_name => 'Comment', :as => :parent # We need to point this relationship to the Comment model, otherwise Rails will look for a 'Child' model 
end 

Cela permettra un commentaire à soit appartiennent à un poste ou un autre commentaire. Comment.last.parent renverra un enregistrement Post ou Comment.

La deuxième option est de faire tous les commentaires appartiennent à un poste spécifique, mais ont leur propre relation parent-enfant:

class Post < ActiveRecord::Base 
    has_many :comments 
end 

class Comment < ActiveRecord::Base 
    belongs_to :post 
    belongs_to :parent, :class_name => 'Comment' # We need to point this relationship to the Comment model, otherwise Rails will look for a 'Parent' model 
    has_many :children, :class_name => 'Comment' # We need to point this relationship to the Comment model, otherwise Rails will look for a 'Child' model 
end 

De cette façon, vos commentaires seront toujours appartenir à un poste, ainsi que le potentiel d'appartenir à un autre commentaire.

Si vous envisagez d'imbriquer des commentaires (au moins plus d'un niveau), je suggère la deuxième option. Cela vous permettrait de récupérer tous les commentaires d'une publication spécifique dans une requête (au lieu de devoir rechercher des enfants pour chaque commentaire), et vous pourriez trier les commentaires dans l'application avant de les afficher. Mais de toute façon devrait fonctionner.

+3

Bonne réponse. +1 –

+0

Wow! Je ne peux pas vous remercier assez pour ça! Merci beaucoup – Trip

+0

De rien. :) – vonconrad

Questions connexes