我正在重新打开 issue #868,因为它今天仍然存在。
我用过 ruby-1.9.3-p362 和 rails 3.2.9
唯一的解决方案是要求子类或使用config.cache_classes = true
> Support.all
=> []
> Employee
=> Employee(id: integer, type: string)
> Administrator
=> Administrator(id: integer, type: string)
> Support.all
=> [#<Administrator id: 1, type: "Administrator">, #<Employee id: 2, type: "Employee">]
我已经在 rails 4 上重现它
Rails 4.0.0. 测试版
红宝石 1.9.3p194
1.9.3p194 :001 > Administrator.create
1.9.3p194 :003 > Employee.create
1.9.3p194 :008 > Support.all
Support Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."type" IN ('Support', 'Administrator', 'Employee')
=> #<ActiveRecord::Relation [#<Administrator id: 1, type: "Administrator">, #<Employee id: 2, type: "Employee">]>
1.9.3p194 :009 > reload!
Reloading...
=> true
1.9.3p194 :010 > Support.all
Support Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."type" IN ('Support')
=> #<ActiveRecord::Relation []>
这是在具有延迟加载类的开发模式下使用 STI 的已知限制。 您需要使用require_dependency
使 Rails 知道这些子类,例如:
# app/models/support.rb
class Support < User
end
require_dependency 'administrator'
require_dependency 'employee'
如果你有很多这样的子类,那么你可以使用Dir[]
和app
一个特殊文件夹来加载它们,例如:
# app/models/user.rb
class User < ActiveRecord::Base
end
Dir["#{Rails.root}/app/users/*.rb"].each do |file|
require_dependency file
end
或者第三种选择是在Model.descendants
对列表进行硬编码,例如:
# app/models/user.rb
class User < ActiveRecord::Base
def self.descendants
[Support, Administrator, Employee]
end
end
我个人没有使用过最后一个,但它应该可以工作。
我有这种问题,无法正常工作。 我的模型是 A、B(及更多)<C、D(及更多)<B。
代码更改后,我得到“未初始化的常量 B”。 以几种方式尝试了 require_dependency,但并不真正知道 1)需要哪个类(B?),以及 2)在哪里做。
这些模型以多种方式与其他模型相关联,这也可能对加载顺序产生影响(例如 A 属于 X、X has_many Bs 和 Cs)
最有用的评论
这是在具有延迟加载类的开发模式下使用 STI 的已知限制。 您需要使用
require_dependency
使 Rails 知道这些子类,例如:如果你有很多这样的子类,那么你可以使用
Dir[]
和app
一个特殊文件夹来加载它们,例如:或者第三种选择是在
Model.descendants
对列表进行硬编码,例如:我个人没有使用过最后一个,但它应该可以工作。