Я бы порекомендовал что-то более похожее на то, как работает форум для того, что вы описываете:
- Пользователь имеет_ множество видео и комментариев
- Видео имеет множество тем
- Тема принадлежит к видео и имеет множество комментариев
- Комментарии принадлежат пользователю и теме
Тогда ваши ассоциации несколько просты, вам даже не нужны никакие ассоциации типов HABTM.
Каковы все возможные комбинации? Нагрузки, но вот несколько примеров:
#Create a video
@user.videos.create(...attributes...)
#Create a topic
@video.topics.create(...attributes...)
#Create a comment
@topic.comments.create(...attributes...)
#Find all comments from a user
@user.comments
#Find all comments from a particular topics
@topic.comments
#Find all comments from a particular user on a particular topic
@topic.comments.where(:user=>foo)
Надеюсь, что это имеет смысл.
-EDIT-
Существуют разные способы найти все комментарии к конкретному видео, вопрос в том, для чего они вам нужны?
Если вы просто хотите показать их в своем представлении, самая простая вещь будет выглядеть примерно так (в HAML):
- for topic in @video.topics do
= topic.title
- for comment in topic.comments do
= comment.body
Чтобы вернуть их как запрос, я полагаю, вы могли бы сделать что-то вроде ...
# untested
Comment.joins(:topics).where('topics.video_id' => video.id)
Вы можете сделать то же самое для комментариев пользователей к видео или просто добавить ассоциацию, где комментарий принадлежит к видео. Одно предупреждение, однако ... - отредактировано, см. Ниже ---
-EDIT-
Хорошо, я забираю это назад, я неправильно запомнил собственное приложение. Я не могу вспомнить ни одной «ошибки», связанной с привязкой комментариев как к видео, так и к теме, поэтому проще всего было бы просто установить комментарии для видео принадлежащих к видео. Убедитесь, что вы проверили ассоциации, чтобы не получить video = nil
в своих записях. Я не проверял это, но, насколько я помню, построение через видео, такое как @video.topics.first.comments.create(:attributes)
, фактически не создает ассоциацию видео, только ассоциацию темы. Я думаю, что я должен был сделать что-то вроде:
@topic.comments.create(...attributes..., :video=>@topic.video)
Проверьте это и будьте уверены.
Теперь, когда я оглянулся на свой собственный код, проблема, с которой я запомнил, была, когда мне нужно было создать вложенное отношение, где объект мог принадлежать родителю того же класса И родительскому контейнеру. IE: комментарии могли иметь вложенные ответы, поэтому комментарии принадлежат темам, а также другим комментариям. Вот что вызвало проблемы. Комментарии, относящиеся к одной теме и одному видео, хороши.
Извините за умственную ошибку:)
После того, как вы получили свою ассоциацию, просто сделайте ...
@video.comments.where(:user=>some_user)
.. и вы получите все комментарии к видео от конкретного пользователя.