Rails根據需要進行模型加載。對於我正在編寫的一個rake任務,我需要遍歷所有ActiveRecord::Base
實例(這可以通過ActiveRecord::Base.send(:subclasses)
來實現)。如何強制Rails加載所有模型?
但是,對於上面的工作,他們必須已經加載。任何人都知道強制所有模型加載的方法?理想情況下,我希望不需要通過app/models
,因爲我想要捕捉插件添加的模型。
Rails根據需要進行模型加載。對於我正在編寫的一個rake任務,我需要遍歷所有ActiveRecord::Base
實例(這可以通過ActiveRecord::Base.send(:subclasses)
來實現)。如何強制Rails加載所有模型?
但是,對於上面的工作,他們必須已經加載。任何人都知道強制所有模型加載的方法?理想情況下,我希望不需要通過app/models
,因爲我想要捕捉插件添加的模型。
梁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
我需要加載此檢查的所有記錄的有效性耙子任務的所有車型,並找到了方便的方法eager_load
,它可以像這樣簡單地使用:
Rails.application.eager_load!
我真的很喜歡這個答案給其他人。在我看來,這是一種更乾淨的方式。 – taelor 2016-01-04 21:09:20
問題是,正如問題所述,這將不會捕獲由插件添加的模型。具體而言,我正在寫的插件的重要情況之一是Spree商店,基本上沒有任何模型在'app/models'中 – scotchi 2010-07-14 12:09:30
只需在glob =>'Dir開始時添加** /'Dir [Rails.root +'**/app/models/**/*。rb']' – tig 2010-07-14 12:13:01
雖然,您爲什麼需要瀏覽所有模型? – tig 2010-07-14 12:14:08