Rails / STI - 通用模型路径

时间:2016-03-07 08:10:45

标签: ruby-on-rails ruby-on-rails-4 single-table-inheritance sti

我试图了解STI是如何工作的,并且我的内容模型设置了Post和Article继承。

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

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

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

2 个答案:

答案 0 :(得分:1)

当您使用单表继承时,您将获得一个且只有一个表中包含“type”列的表。因此,在您的情况下,您有表“内容”,其中包含“type”列,您可以在其中存储其中一个字符串:“post”或“article”。

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

因为Post和Article都是同一个表“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,因为第二个会引发您需要处理/救援的异常,第一个会返回nil

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

答案 1 :(得分:1)

快速修复可能是:

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