Rails/STI - 通用模型路径

Rails/STI - common model path

我正在尝试了解 STI 的工作原理,并且我使用 Post 设置了我的内容模型,并从中继承了文章。

我也有评论模型。在评论控制器中,我有这个:

def find_content
  @content = Content.find(params[:content_id])
end

显然,它不起作用,因为参数显示 post_id 或 article_id。我如何告诉评论控制器根据参数拉入相关的 content_id?

当您使用单一 table 继承时,您会得到一个并且只有一个 table 包含列 "type"。因此,在您的情况下,您有 table "contents" 和 "type" 列,您在其中存储字符串之一:"post" 或 "article".

当您在 Rails 应用程序中使用 STI 时,您必须定义三个模型:内容(作为常规模型继承自 ActiveRecord::Base)、Post 和文章(均继承自Content) 并直接对其进行操作,例如:Post.findArticle.last.

因为 Post 和 Article 都是同一行 table "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 因为第二个会引发异常,你需要 handle/rescue 而第一个会 return nil

当然,我的例子不够优雅,但我希望你能明白我的意思。

快速修复可能是:

@content = Content.find(params[:post_id] || params[:article_id])

您的参数应该是 article_idpost_id。因此,您可以尝试捕获这两个参数并将它们与逻辑或运算符 (||) 组合起来。所以你得到一个 article_id 或 post_id 可以与 Content.find.

一起使用
params
# => {:article_id=>1, :other_parameter=>"value"}

params[:post_id] || params[:article_id]
# => 1

如果没有任何参数,您将获得 nilContent.find 失败并出现 ActiveRecord::RecordNotFound 异常。没关系,我想。稍后您将在控制器中修复此错误以显示 404 页面。