我正在尝试了解STI的工作原理,并且我设置了内容模型,并从中继承了帖子和文章。
我还有一个评论模型。在评论控制器中,我有这个:
def find_content
@content = Content.find(params[:content_id])
end
显然,它不起作用,因为参数显示post_id或article_id。如何告诉注释控制器根据参数拉入相关content_id?
快速解决方法可能是:
@content = Content.find(params[:post_id] || params[:article_id])
在您的参数中应为article_id
或post_id
。因此,您可以尝试捕获这两个参数并将它们与逻辑或运算符(||
)组合在一起。因此,您可以获得可以与Content.find
一起使用的article_id或post_id。
params
# => {:article_id=>1, :other_parameter=>"value"}
params[:post_id] || params[:article_id]
# => 1
如果两个参数都没有,则会nil
并且Content.find
失败并出现ActiveRecord::RecordNotFound
异常。没关系,我想。稍后,您将在控制器中拯救此错误以显示404页面。
当您使用单个表继承时,您将获得一个且只有一个包含"type"列的表。因此,在您的情况下,您有带有"类型"列的表"内容",您可以在其中存储其中一个字符串:"帖子"或"文章"。
当你在Rails应用程序中使用STI时,你必须定义三个模型:内容(继承自ActiveRecord::Base
作为常规模型),帖子和文章(都继承自Content
),并直接对它们进行操作,例如:Post.find
,Article.last
。
因为帖子和文章都是同一表"内容"的行,所以它们中的每一个总是有一个不同的 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
。
当然,我的例子并不优雅,但我希望你能明白这一点。