Ruby on rails 如何强制Rails加载所有模型?
Rails不按需建模加载。对于我正在编写的rake任务,我需要能够迭代所有Ruby on rails 如何强制Rails加载所有模型?,ruby-on-rails,ruby,rake,Ruby On Rails,Ruby,Rake,Rails不按需建模加载。对于我正在编写的rake任务,我需要能够迭代所有ActiveRecord::Base实例(这在ActiveRecord::Base.send(:子类)中是可能的) 但是,要使上述功能正常工作,必须已加载它们。有人知道强制加载所有模型的方法吗?理想情况下,我不想翻看应用程序/模型,因为我也想看到插件添加的模型。rails 2: Dir[Pathname(RAILS_ROOT) + 'app/models/**/*.rb'].each do |path| require
ActiveRecord::Base
实例(这在ActiveRecord::Base.send(:子类)
中是可能的)
但是,要使上述功能正常工作,必须已加载它们。有人知道强制加载所有模型的方法吗?理想情况下,我不想翻看应用程序/模型
,因为我也想看到插件添加的模型。rails 2:
Dir[Pathname(RAILS_ROOT) + 'app/models/**/*.rb'].each do |path|
require path
end
轨道3:
Dir[Rails.root + 'app/models/**/*.rb'].each do |path|
require path
end
另一种方式:
(ActiveRecord::Base.connection.tables - %w[schema_migrations]).each do |table|
table.classify.constantize rescue nil
end
我需要为检查所有记录的有效性的rake任务加载所有模型,并找到了简便的方法,它可以像这样简单地使用:
Rails.application.eager\u加载代码>问题是,正如问题中所指出的,它不会捕获插件添加的模型。具体来说,我正在编写的插件的一个重要案例是Spree shop,其中基本上没有任何模型位于app/models
中,只需在glob=>Dir[Rails.root+'***/app/models/***.rb']
的开头添加***/
,为什么需要浏览所有的模型?它是一个工具,基本上可以从所有的:has_许多关系中构建一个图表,然后以有趣的方式查询这些关系。请注意,Rails.root在Rails 2中已经使用了很长一段时间。我真的比较喜欢这个答案。在我看来,这是一种更干净的做事方式。需要注意的是,即使设置了Rails.application.config.eager\u load=true
,这在Rails 6.0中也不起作用。