在我的数据库中,我有一个表people
,我使用单表继承,这些类:
class Person < ActiveRecord::Base
end
class Member < Person
end
class Business < Member
end
它产生的查询让我感到困惑。我想要的是Member.all
返回所有企业以及会员的任何其他子类型。它确实如此,但前提是我最近访问过Business类。我认为这是因为我的课程没有在开发模式中缓存(出于显而易见的原因),但它仍然看起来像是奇怪/错误的行为。
这是rails中的错误吗?还是按预期工作?在任何一种情况下,任何人都可以想到一个很好的解决方案用于开发目的吗?
答案 0 :(得分:3)
默认情况下,Rails并不急于在开发中加载您的类。尝试更改config/environments/development.rb
中的以下行:
# Do not eager load code on boot.
config.eager_load = false
为:
# Do eager load code on boot!
config.eager_load = true
答案 1 :(得分:3)
这是故意行为 - Autoloading and Reloading Constants上的官方Rails指南在Autoloading and STI部分中解释得非常好:
...
确保无论顺序如何都能正常工作的方法 执行是在底部手动加载树的叶子 定义根类的文件:
# app/models/polygon.rb class Polygon < ApplicationRecord end require_dependency 'square'
只需要加载至少孙子的叶子 办法。直接子类不需要预加载。如果是层次结构 更深层次,中间类将从递归自动加载 底部因为它们的常量会出现在类定义中 作为超类。
因此,在您的情况下,这意味着将require_dependency "business"
放在Person类的末尾。
但是,要注意使用require
而不是require_dependency
可以避免的循环依赖(尽管它可能会禁止Rails在进行更改时跟踪和重新加载文件 - 毕竟,{ {1}}是一种Rails内部方法。)