Все ли соединительные таблицы имеют таблицы? - PullRequest
3 голосов
/ 14 октября 2010

Например, у меня есть модель комментариев, и у меня есть модель поста, но комментарии могут комментировать другие комментарии.

Так что, похоже, мне нужна таблица соединений, которую я позвоню commentables.Чтобы создать это, мне действительно нужно создать комментируемую таблицу с post_id и comment_id?

Или я могу сделать что-то подобное без одного:

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

Не совсем уверен, что это лучший способ сделать это.Я огромный новичок.

1 Ответ

5 голосов
/ 14 октября 2010

Нет, в этом случае вам не нужна таблица соединений. Таблицы объединения предназначены для отношений 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

Таким образом, ваши комментарии всегда будут принадлежать посту, а также могут принадлежать другому комментарию.

Если вы планируете вкладывать комментарии (не менее одного уровня), я бы предложил второй вариант. Это позволит вам получать все комментарии для определенного поста в одном запросе (вместо того, чтобы искать детей для каждого комментария), и вы сможете отсортировать комментарии в приложении перед их отображением. Но в любом случае должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...