2010-07-14 34 views
11

Rails根據需要進行模型加載。對於我正在編寫的一個rake任務,我需要遍歷所有ActiveRecord::Base實例(這可以通過ActiveRecord::Base.send(:subclasses)來實現)。如何強制Rails加載所有模型?

但是,對於上面的工作,他們必須已經加載。任何人都知道強制所有模型加載的方法?理想情況下,我希望不需要通過app/models,因爲我想要捕捉插件添加的模型。

回答

12

梁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 
+1

問題是,正如問題所述,這將不會捕獲由插件添加的模型。具體而言,我正在寫的插件的重要情況之一是Spree商店,基本上沒有任何模型在'app/models'中 – scotchi 2010-07-14 12:09:30

+0

只需在glob =>'Dir開始時添加** /'Dir [Rails.root +'**/app/models/**/*。rb']' – tig 2010-07-14 12:13:01

+0

雖然,您爲什麼需要瀏覽所有模型? – tig 2010-07-14 12:14:08

26

我需要加載此檢查的所有記錄的有效性耙子任務的所有車型,並找到了方便的方法eager_load,它可以像這樣簡單地使用:

Rails.application.eager_load!

+5

我真的很喜歡這個答案給其他人。在我看來,這是一種更乾淨的方式。 – taelor 2016-01-04 21:09:20