Rails 3中具有多个父资源的嵌套资源

时间:2010-12-13 22:50:27

标签: ruby-on-rails ruby-on-rails-3

我想创建一个模型来存储与文章相关的评论。我有一种强烈的感觉,在将来我也会想要对应用程序中的其他对象发表评论。如何在我的应用程序中设计注释,以便它与添加新的父对象向前兼容。我想避免一个场景,其中每个对象都有多个控制器/模型来评论关系。

观看了Ryan Bates在Nested Resource的屏幕投射后,我牢牢掌握了tp如何在单亲家庭下筑巢资源。如何在2个或更多父资源下实现此目标?

谢谢!

2 个答案:

答案 0 :(得分:5)

对于“向前兼容添加新的父对象”问题的一部分:

您可以使用Polymorphic Associations。这是一个nice example。另请参阅RailsCast #154

它的外观如下:

comments表格列'可以是这样的:

id:integer
commentable_type:string
commentable_id:integer
comment_text:string

一些示例记录:

1,'Article',12,'My first comment' #comment on an Article model
2,'Question',12,'My first comment' #comment on a Question model
3,'Question',15,'My first comment' #comment on a Question model

答案 1 :(得分:0)

回答有关路线的部分并找到资源。

通常的rails控制器会从父节点找到子资源。

GET /articles/{parent_id}/comments/{id}

GET /articles/0/comments/1

article = articles.find(parent_id = 0)
comment = article.comments.find(id = 1)

你不能用多态父母那样做。你必须找到孩子的父母。

GET /article/{parent_id}/comments/{id}
GET /questions/{parent_id}/comments/{id}

GET /article/0/comments/1
GET /questions/0/comments/1

parent = comments.select(parent_id = 0).parent
comment = parent.comments.find(id = 1)

可以使您的路线将类型传递给控制器​​。

GET /{parent_type}/{parent_id}/comments/{id}

GET /article/0/comments/1
GET /questions/0/comments/1

parent = parent_type.find(parent_id = 0)
comment = parent.comments.find(id = 1)

(我没试过这种方法,这显然是伪代码。)

编辑...

我想你也可以为每种类型的父母添加一个参数。

GET /article/{article_id}/comments/{id}
GET /questions/{question_id}/comments/{id}

GET /article/0/comments/1
GET /questions/0/comments/1

if article_id
    article = articles.find(article_id = 0)
    comment = article.comments.find(id = 1)

if question_id
    question = questions.find(question_id = 0)
    comment = question.comments.find(id = 1)