如果我有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控制台中运行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.first
,每当我运行Another::Child
时如何一致地调用第三个查询是Child
的子类?
您描述的行为是由Rails模型在开发模式下的延迟加载引起的(默认情况下,开发者禁用了急切加载)。在您第一次运行Another::Child.first
Another::Child
尚未加载之前。
您可以通过将Rails.application.config.eager_load = true
添加到初始化程序文件来在所有环境中启用预先加载。
在开发中不使用预先加载的原因是因为应用程序可以(重新)加载更快。但是,当禁用eager loading时,我遇到了很多问题,特别是对于你正在使用的STI模型。它可能会变得非常令人头疼,因为开发环境的行为与生产环境不同,所以它可能会导致错误。出于这些原因,我通常建议设置eager_load = true
。