Каков наилучший способ создания этих сложных модельных ассоциаций? - PullRequest
1 голос
/ 03 апреля 2011

Я хочу добавить комментарии к своему приложению, чтобы владелец видео мог выбрать для этого видео количество столбцов / форм комментариев рядом и добавить заголовок к каждому столбцу, а затем пользователи смогут комментировать один из них.или больше столбцов.

Я думаю о настройке модели VideoComment, таблица которой выглядит следующим образом:

-------------------------------------
id | video_id | user_id | comment_id

Тогда видео будет иметь has_many через ассоциацию с комментариями через VideoComment.Кроме того, пользователи будут иметь has_many через ассоциацию с каждым комментарием и видео через VideoComment.

Для поддержки нескольких столбцов, я думаю о том, чтобы Comment имел связь habtm с другой моделью CommentColumns.

Комментарий будет выглядеть так:

-----------------------------
id | body

CommentColumns будет выглядеть следующим образом:

------------------------
id | title

И таблица соединения между комментарием и commentColumn будет иметь вид CommentMatching:

------------------------------
comment_id | comment_column_id

Мой первый вопрос ... Я на правильном пути или я значительно далек?

Мой второй вопрос ... Каковы все возможные комбинации для доступа к различным ассоциациям данных вмой контроллер?

PS.Не стесняйся!Пожалуйста, задавайте мне любые вопросы, если вы хотите, чтобы я кое-что прояснил.

1 Ответ

4 голосов
/ 03 апреля 2011

Я бы порекомендовал что-то более похожее на то, как работает форум для того, что вы описываете:

  • Пользователь имеет_ множество видео и комментариев
  • Видео имеет множество тем
  • Тема принадлежит к видео и имеет множество комментариев
  • Комментарии принадлежат пользователю и теме

Тогда ваши ассоциации несколько просты, вам даже не нужны никакие ассоциации типов 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)

.. и вы получите все комментарии к видео от конкретного пользователя.

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