我试图了解STI是如何工作的,并且我的内容模型设置了Post和Article继承。
我也有一个评论模型。在评论控制器中,我有这个:
def find_content
@content = Content.find(params[:content_id])
end
显然,由于params显示post_id或article_id,因此无法正常工作。如何告诉注释控制器根据参数拉入相关的content_id?
答案 0 :(得分:1)
当您使用单表继承时,您将获得一个且只有一个表中包含“type”列的表。因此,在您的情况下,您有表“内容”,其中包含“type”列,您可以在其中存储其中一个字符串:“post”或“article”。
在Rails应用程序中使用STI时,您必须定义三个模型:内容(从ActiveRecord::Base
继承作为常规模型),Post和Article(都继承自Content
)并对它们进行操作直接,例如:Post.find
,Article.last
。
因为Post和Article都是同一个表“contents”的行,所以每个都有一个不同的id。我不知道你的应用程序的逻辑和你想要实现的目标(例如,我无法理解Post和Article之间的逻辑区别),但我建议从你的例子中实现这个动作:
def find_content
@content = Post.find_by_id(params[:content_id]) || Article.find_by_id(params[:content_id]
end
我使用.find_by_id
而不是.find
,因为第二个会引发您需要处理/救援的异常,第一个会返回nil
。
当然,我的例子并不优雅,但我希望你能明白这一点。
答案 1 :(得分:1)
快速修复可能是:
@content = Content.find(params[:post_id] || params[:article_id])
您的参数应为article_id
或post_id
。因此,您可以尝试捕获这两个参数,并将它们与逻辑或运算符(||
)组合在一起。所以你得到一个article_id或一个post_id,可以用Content.find
。
params
# => {:article_id=>1, :other_parameter=>"value"}
params[:post_id] || params[:article_id]
# => 1
如果没有任何参数,则nil
和Content.find
失败且ActiveRecord::RecordNotFound
例外。我想,那没关系。稍后您将在控制器中解救此错误以显示404页面。