对于从一个ActiveRecord::Base
模型继承的10个模型,我有一个STI。
class Listing::Numeric < ActiveRecord::Base
end
class Listing::AverageDuration < Listing::Numeric
end
class Listing::TotalViews < Listing::Numeric
end
有10个这样的模型继承自Listing::Numeric
在rails控制台中,当我尝试.descendants
或.subclasses
时,它会返回一个空数组。
Listing::Numeric.descendants
=> []
Listing::Numeric.subclasses
=> []
理想情况下这应该有用。
为什么它没有返回预期的子类?
答案 0 :(得分:7)
只有在某些正在运行的代码中引用了所有继承的类时才会起作用,因为rails会在需要时加载类,然后只将它作为后代添加
例如:
Listing::Numeric.descendants.count
=> 0
Listing::AverageDuration
Listing::TotalViews
Listing::Numeric.descendants.count
=> 2
答案 1 :(得分:1)
在调用.descendants方法之前执行Rails.application.eager_load!
。
答案 2 :(得分:1)
旧问,但对于像我这样的人,对子类MyClass.subclasses => []
的空列表感到困惑
您需要将依赖项显式设置为MySubclass类。
class MyClass < ApplicationRecord
end
require_dependency 'my_subclass'
$ MyClass.subclasses
=> ['MySubclass']
https://guides.rubyonrails.org/autoloading_and_reloading_constants.html#autoloading-and-sti
答案 3 :(得分:0)
这对我有帮助
config.autoload_paths += %W( #{config.root}/app/models/listings )