ActiveSupport :: DescendantsTracker.descendants不返回后代

时间:2013-05-24 14:40:51

标签: ruby-on-rails ruby

此问题与另一个关于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更快。

更快?好吧,它必须更快地返回任何东西(对吧?),但它应该返回所提供类的后代。

2 个答案:

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