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.
Bonne réponse. +1 –
Wow! Je ne peux pas vous remercier assez pour ça! Merci beaucoup – Trip
De rien. :) – vonconrad