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.find
、Article.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_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 页面。
我正在尝试了解 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.find
、Article.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_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 页面。