此问题与另一个关于Looking up all the descendants of a class in Ruby的堆栈溢出问题类似/相关。一个很好的问题,我正在寻找的信息 - 除了我下载到rails控制台时:
irb(main):001:0> ActiveSupport::DescendantsTracker.descendants(Object)
=>[]
irb(main):002:0> ObjectSpace.each_object(Class).select { |klass| klass < Object }
=> [IRB::Notifier::AbstractNotifier, IRB::Notifier::ErrUnrecognizedLevel, ...]
那么,为什么ActiveSupport :: DescendantsTracker不返回Object的后代?实施中有什么不同? documentation for DescendantsTracker表明:
该模块提供了一个跟踪后代的内部实现,它比迭代ObjectSpace更快。
更快?好吧,它必须更快地返回任何东西(对吧?),但它应该返回所提供类的后代。
答案 0 :(得分:2)
ActiveSupport::DescendantsTracker.descendants(Object)
将在您的控制台中返回空白,因为开发控制台无法编译您的应用程序,它尚未加载所有类,因此不知道它们是否输出它们!
看看这个问题:RoR: MyModel.descendants returns [] in a view after the first call?
答案 1 :(得分:2)
您需要急切加载课程,如:https://github.com/rails/rails/issues/3364
中所述ActionDispatch::Reloader.to_prepare do
Rails.application.eager_load!
end