【问题标题】:ActiveSupport::DescendantsTracker.descendants not returning descendantsActiveSupport::DescendantsTracker.descendants 不返回后代
【发布时间】:2013-05-24 14:40:50
【问题描述】:

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

更快?好吧,什么都不返回比什么都快(对吗?),但它应该返回所提供类的后代。

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    ActiveSupport::DescendantsTracker.descendants(Object) 将在您的控制台中返回空白,因为开发控制台没有编译您的应用程序,它还没有加载所有类,因此不知道它们以输出它们!

    看看这个问题:RoR: MyModel.descendants returns [] in a view after the first call?

    【讨论】:

    • 我已经阅读了相关的帖子,但我仍然不明白。我如何测试这个功能?我尝试在 config\development.rb 中设置 config.cache_classes = true 无效...
    • 您是否尝试过未接受答案中的初始化程序? Dir[Rails.root + 'app/models/*.rb'].map {|f| File.basename(f, '.*').camelize.constantize }
    • 为什么我需要加载应用程序的模型才能查看 Object 的后代? Rails 不应该已经知道它们吗?如果我在控制台中引用类名,rails 是否不会加载该对象?
    • 对不起...我的最后一条评论没有回答您之前评论中的问题。我确实尝试过,但它没有用 - 我更改了路径以使用我想要获取后代的模块的类文件的位置。我不得不将该行更新为Dir[Rails.root + 'lib/modules/&lt;module_name&gt;/*.rb'].map { |f| "&lt;Module_name&gt;::#{File.basename(f, '.*').camelize}".constantize }。这给了我预期的类,但在使用 ActiveSupport::DescendantsTracker.descendants 时仍然是一个空的结果集,而 ObjectSpace 方法给了我预期的结果。
    • 一年多之后,我又遇到了这个问题……评论中的初始化程序起作用了。
    【解决方案2】:

    您需要预先加载类,如:https://github.com/rails/rails/issues/3364

    ActionDispatch::Reloader.to_prepare do
      Rails.application.eager_load!
    end
    

    【讨论】:

    • 有趣...阅读 rails issue - 为该问题提供了一个有趣的背景故事。我相信使用ActionDispatch::Reloader... 是用于开发模式下的rails 服务器,但控制台的解决方案似乎只是调用Rails.application.eager_load!。我两个都试试。
    猜你喜欢
    • 1970-01-01
    • 2012-04-23
    • 2017-12-19
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 2017-09-11
    相关资源
    最近更新 更多