如果我有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.first
是Another::Child
的子类,如何在每次运行Child
时始终调用第三查询?
答案 0 :(得分:1)
您描述的行为是由开发模式下的Rails模型的延迟加载引起的(默认情况下,development禁用了紧急加载)。首次运行Another::Child.first
之前,尚未加载Another::Child
。
您可以通过将Rails.application.config.eager_load = true
添加到初始化程序文件来在所有环境中启用紧急加载。
在开发中不使用 加载的原因是因为该应用可以更快地(重新)加载。但是,禁用快速加载时会遇到很多问题,尤其是对于您正在使用的STI模型。由于开发环境与生产环境的行为不同,因此管理起来非常麻烦,并且可能导致错误。由于这些原因,我通常建议设置eager_load = true
。