繁体   English   中英

Rails / STI-通用模型路径

[英]Rails/STI - common model path

我正在尝试了解STI的工作方式,并且设置了我的内容模型,并从中继承了Post和Article。

我也有一个Comment模型。 在注释控制器中,我有以下内容:

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

显然,由于参数显示post_id或article_id,因此无法正常工作。 如何告诉注释控制器根据参数引入相关的content_id?

当您使用单表继承时,您将获得一个且只有一个带有“类型”列的表。 因此,在您的情况下,您具有表“ contents”和“ type”列,在其中存储以下字符串之一:“ post”或“ article”。

在Rails应用程序中使用STI时,必须定义三个模型:Content(作为常规模型从ActiveRecord::Base继承),Post和Article(均从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

当然,我的例子并不优雅,但是希望您能理解。

快速修复方法可能是:

@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页面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM