Ruby on rails Rails 4-带命名空间的STI

Ruby on rails Rails 4-带命名空间的STI,ruby-on-rails,ruby,ruby-on-rails-4,namespaces,single-table-inheritance,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 类父级

如果我有3门课,如下所示:

class Parent < ActiveRecord::Base
end

class Child < Parent
end

class Another::Child < ::Child
end
类父级
所有这3个类都位于不同的文件夹中

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

之后,我在rails控制台中运行
另一个::Child.first
,这个查询是从parents.type in('other::Child')ORDER BY parents.id ASC LIMIT 1
生成的

在rails控制台中运行这两个命令后,我再次运行
Child.first
,查询变成
SELECT parents.*FROM parents WHERE parents.type in('Child','other::Child')ORDER BY parents.id ASC LIMIT 1

原因是什么


如何在运行
另一个::Child时始终调用第三个查询。首先考虑
另一个::Child
Child
的子类?

您描述的行为是由于在开发模式下延迟加载Rails模型造成的(对于developent,默认情况下禁用了快速加载)。运行
另一个::Child之前。第一次
另一个::Child
尚未加载

通过将
Rails.application.config.eager\u load=true
添加到初始值设定项文件,可以在所有环境中启用即时加载


在开发中不使用即时加载的原因是应用程序可以更快地(重新)加载。然而,当禁用“急切加载”时,我遇到了很多问题,尤其是像您正在使用的STI模型。它可能会成为一个非常头疼的问题,并且可能会导致bug,因为开发环境的行为与生产环境不同。出于这些原因,我通常建议设置
eager\u load=true

您描述的行为是由于在开发模式下延迟加载Rails模型造成的(对于developent,默认情况下禁用了eager load)。运行
另一个::Child之前。第一次
另一个::Child
尚未加载

通过将
Rails.application.config.eager\u load=true
添加到初始值设定项文件,可以在所有环境中启用即时加载

在开发中不使用即时加载的原因是应用程序可以更快地(重新)加载。然而,当禁用“急切加载”时,我遇到了很多问题,尤其是像您正在使用的STI模型。它可能会成为一个非常头疼的问题,并且可能会导致bug,因为开发环境的行为与生产环境不同。出于这些原因,我通常建议设置
eager\u load=true