我想创建一个模型来存储与文章相关的评论。我有一种强烈的感觉,在将来我也会想要对应用程序中的其他对象发表评论。如何在我的应用程序中设计注释,以便它与添加新的父对象向前兼容。我想避免一个场景,其中每个对象都有多个控制器/模型来评论关系。
观看了Ryan Bates在Nested Resource的屏幕投射后,我牢牢掌握了tp如何在单亲家庭下筑巢资源。如何在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)