在Rails 8中列出所有派生类

编程语言 2026-07-10

我想在Rails中列出某个特定类的所有子孙类(如果需要的话,ApplicationComponent): 启用预加载时,这很容易

ApplicationComponent.descendants

但开发环境通常没有启用预加载,在这种情况下,这将返回 []。由于进行自动加载需要一段时间(在 Zeitwerk::Loader.eager_load_all 的情况下),我希望能用 #eager_load_namespace 只加载我需要的那些:

loader = Zeitwerk::Loader.new
loader.push_dir('app/components')
loader.setup
loader.eager_load_namespace(ApplicationComponent)

但随后 .descendents 会给我 []

同样地,

Zeitwerk::Loader.eager_load_namespace(ApplicationComponent)

我是不是漏掉了什么?

解决方案

这似乎是一个概念性的问题,已经有一个加载器在管理我关心的目录,Rails.autoloaders.main,需要被指示进行预加载。经过实验我发现,向 config/application.rb 添加以下内容

config.to_prepare do
  Rails
    .autoloaders
    .main
    .eager_load_dir(Rails.root.join('app/components'))
end

可以确保 ApplicationComponent.descendants 在所有环境中返回完整的子类列表,同时对启动时间没有明显影响。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章