gpt4 book ai didi

ruby-on-rails - 在 Rails 初始化上加载子类

转载 作者:行者123 更新时间:2023-12-04 05:57:39 26 4
gpt4 key购买 nike

我在让 Rails (3.1.3) 在应用程序初始化时加载我的一些 ActiveRecord 子类时遇到问题。这是我的目录结构:

- models
- class1.rb # Class1 < ActiveRecord::Base
- class1s
- subclass1.rb # Subclass1 < Class1
- subclass2.rb # Subclass2 < Class1

我正在尝试使用 Class1.subclasses ,但它不断返回 [] .添加 #{config.root}/app/models/class1sconfig.autoload_paths没有帮助,因为在我调用 subclasses 之前,这些类是延迟加载的,并且没有任何内容引用子类。 ,所以他们还没有加载。将路径添加到 config.eager_load_paths似乎也不起作用,它的行为基于 config.cache_classes通常在开发和生产中不同的设置。

我希望能够启动 rails 控制台并查看:
> Class1.subclasses
=> [Subclass1, Subclass2]

现在这是我看到的行为:
> Class1.subclasses
=> []
> Subclass1
=> Subclass1
> Class1.subclasses
=> [Subclass1]
> Subclass2
=> Subclass2
> Class1.subclasses
=> [Subclass1, Subclass2]

现在,我只能将它放在 Class1 定义的底部,以便在访问 Class1 类时加载所有子类:
ruby_files_pattern = File.join(Rails.application.config.root, "app", "models", "class1s", "**", "*.rb")
Dir.glob(ruby_files_pattern).each do |file|
ActiveSupport::Dependencies.require_or_load(file)
end

它完成了工作,但我觉得这样做很脏。任何想法将不胜感激。

最佳答案

最简单的方法是使用 ( >= 3.0 ) 加载所有类:

Rails.application.eager_load!

它将从您的应用程序、引擎、插件加载所有类。与配置中的延迟加载结果相同。但是在这种方法中,您不需要这样做,只需使用此方法即可。

关于ruby-on-rails - 在 Rails 初始化上加载子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8306255/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com