2011-04-03 52 views
1

我想向我的应用程序添加评论,以便视频的所有者可以为该视频选择多个评论栏/表单,并为每个栏添加标题,然后用户可以对其中一个评论或更多的专栏。建立这些复杂模型关联的最佳方式是什么?

我想建立其表看起来像这样一个VideoComment模式:

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

然后视频将有一个的has_many通过与通过VideoComment意见关联。此外,用户可以通过VideoComment通过与每条评论和视频的关联来获得has_many。

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

评论看起来就像这样:

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

CommentColumns看起来就像这样:

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

而且加入了注释,commentColumn间表将CommentMatching:

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

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

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

PS。不要害羞!如果你想让我澄清一些事情,请问我任何问题。

回答

4

我会建议沿东西的论坛是如何工作的线条更加什么你描述:

  • A用户的has_many视频和评论
  • 视频的has_many主题
  • belongs_to的视频主题和评论的has_many
  • 评论belong_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) 

希望是有道理的。

CNC中

有,你可以找到一个特定的视频全部评论不同的方式,问题是你有什么需要他们?

如果你只是想向他们展示在你看来,最简单的事情会是这样的(在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的视频评论。一个警告,虽然... --edited出来,见下文---

CNC中

好吧,我收回,我想起了我自己的应用程序错误。有没有“陷阱”,我记得大约意见既视频和一个主题相关联,所以最简单的事情也只是设置意见belong_to视频以及。请确保并测试这些关联,以便在记录中不会获得video = nil。我没有测试这个,但作为我记得通过像@video.topics.first.comments.create(:attributes)视频建设实际上不创建视频关联,只有主题关联。我认为我不得不做更类似的事情:

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

测试并确保。

现在我回头看我自己的代码是什么,我记得有,当我需要建立一个嵌套的关系,其中一个对象可能属于同一类的父与父容器是个麻烦。 IE:评论可能嵌套回复,所以评论属于主题,也属于其他评论。这是什么引起麻烦。属于一个主题和一个视频的评论很好。

很抱歉的心理失误:)

你有你的关联后只是做...

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

..和你会从特定坐上视频所有评论用户。

+0

你的设置使得除了一件事感觉,让我困惑:视频有很多话题和主题有很多的意见,但我想像这样一个表的评论跨越的垂直主题的多种每个水平评论蔓延,等等不会有评论有很多话题?或者每个评论实际上只是一个块而不是整个水平行? – 2011-04-03 03:08:56

+0

此外,您将如何获得用户对特定视频的所有评论? – 2011-04-03 03:13:19

+0

类似于@ @ video.topics.comments.where(:user_id => X)'? – 2011-04-03 03:23:46

相关问题