Нет, в этом случае вам не нужна таблица соединений. Таблицы объединения предназначены для отношений has_and_belongs_to_many
, и в этом случае вам не нужно иметь один из них (комментарии не могут принадлежать многим сообщениям, не так ли?).
У вас есть два варианта. Первый заключается в создании полиморфных отношений:
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
Это позволит комментарию к либо принадлежать записи, либо другому комментарию. Comment.last.parent
вернет либо Post
, либо Comment
запись.
Второй вариант - сделать все комментарии принадлежащими определенному сообщению, но иметь собственные отношения родитель-потомок:
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
Таким образом, ваши комментарии всегда будут принадлежать посту, а также могут принадлежать другому комментарию.
Если вы планируете вкладывать комментарии (не менее одного уровня), я бы предложил второй вариант. Это позволит вам получать все комментарии для определенного поста в одном запросе (вместо того, чтобы искать детей для каждого комментария), и вы сможете отсортировать комментарии в приложении перед их отображением. Но в любом случае должно работать.