Rails 4-具有名称空间的STI

时间:2018-09-18 10:55:13

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

如果我有3个如下所示的课程:

class Parent < ActiveRecord::Base
end

class Child < Parent
end

class Another::Child < ::Child
end

所有这三个类都位于不同的文件夹中。

在Rails控制台中,Child.first运行此查询SELECT parents.* FROM parents WHERE parents.type IN ('Child') ORDER BY parents.id ASC LIMIT 1

然后,我在Rails控制台中运行Another::Child.first,并生成SELECT parents.* FROM parents WHERE parents.type IN ('Another::Child') ORDER BY parents.id ASC LIMIT 1这个查询。

在Rails控制台中运行两个命令后,然后再次运行Child.first,查询变为SELECT parents.* FROM parents WHERE parents.type IN ('Child', 'Another::Child') ORDER BY parents.id ASC LIMIT 1

这是什么原因?

考虑到Another::Child.firstAnother::Child的子类,如何在每次运行Child时始终调用第三查询?

1 个答案:

答案 0 :(得分:1)

您描述的行为是由开发模式下的Rails模型的延迟加载引起的(默认情况下,development禁用了紧急加载)。首次运行Another::Child.first之前,尚未加载Another::Child

您可以通过将Rails.application.config.eager_load = true添加到初始化程序文件来在所有环境中启用紧急加载。

在开发中不使用 加载的原因是因为该应用可以更快地(重新)加载。但是,禁用快速加载时会遇到很多问题,尤其是对于您正在使用的STI模型。由于开发环境与生产环境的行为不同,因此管理起来非常麻烦,并且可能导致错误。由于这些原因,我通常建议设置eager_load = true