导轨/STI - 通用模型路径



我正在尝试了解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_idpost_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.findArticle.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

当然,我的例子并不优雅,但我希望你能明白这一点。

最新更新