建立这些复杂模型关联的最佳方法是什么?

时间:2011-04-03 02:44:31

标签: ruby-on-rails ruby database database-design associations

我想在我的应用程序中添加评论,以便视频的所有者可以为该视频选择并排评论列/表单的数量,并为每列添加标题,然后用户可以评论一个或更多列。

我正在考虑设置一个VideoComment模型,其表格如下所示:

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

然后,视频将通过VideoComment与评论相关联。此外,用户可以通过VideoComment与每个评论和视频建立联系。

为了支持多列,我正在考虑让Comment与另一个模型CommentColumns有一个habtm关联。

评论将如下所示:

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

CommentColumns将如下所示:

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

注释和commentColumn之间的连接表将是CommentMatching:

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

我的第一个问题是......我是在正确的轨道上,还是我离得很远?

我的第二个问题是......在我的控制器中访问不同数据关联的所有可能组合是什么?

PS。别害羞!如果您希望我澄清一些问题,请问我任何问题。

1 个答案:

答案 0 :(得分:4)

我会建议更多关于论坛如何为你所描述的内容工作的内容:

  • 用户has_many视频和评论
  • 视频has_many主题
  • 主题belongs_to video和has_many comments
  • 评论belongs_to用户和主题

然后你的关联有点简单,你甚至不需要任何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)

希望这是有道理的。

- 编辑 -

您可以通过不同的方式查找特定视频的所有评论,问题是您需要什么?

如果您只想在视图中显示它们,最简单的事情就是这样(在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)

您可以针对每个视频的用户评论执行相同操作,或者您可以添加评论belongs_to视频的关联。一个警告,虽然...... - 编辑出来,见下文---

- 编辑 -

好的,我把它拿回来,我记得自己错误的应用程序。我无法回忆起关于将评论与视频和主题相关联的“陷阱”,因此最简单的方法就是将评论设置为belongs_to视频。请确保并测试关联,这样您就不会在记录中获得video = nil。我没有对此进行测试,但我记得像@video.topics.first.comments.create(:attributes)这样的视频构建实际上并不创建视频关联,只有主题关联。我想我必须做更多的事情:

@topic.comments.create(...attributes..., :video=>@topic.video)

测试并确定。

现在我回头看看我自己的代码,当我需要构建一个嵌套关系时,我需要构建一个嵌套关系,其中一个对象可以属于同一个类的父级和一个父容器。 IE:评论可能有嵌套的回复,因此评论属于主题,也属于其他评论。这就是麻烦。属于一个主题和一个视频的评论很好。

抱歉精神失误:)

在你得到你的协会之后就做......

@video.comments.where(:user=>some_user)

..您将获得特定用户视频的所有评论。