单表继承(STI)父级ActiveRecord .subclasses .descendants返回空

时间:2013-12-27 09:23:36

标签: ruby-on-rails ruby activerecord single-table-inheritance ruby-2.0

对于从一个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
=> []

理想情况下这应该有用。

为什么它没有返回预期的子类?

4 个答案:

答案 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 )

从这里采取 - http://hakunin.com/rails3-load-paths