2010-07-30 68 views
5

我知道,你可以做這樣的事情來加載Rails環境:ActiveRecord遷移和耙子任務不加載模型?

task :my_task => :environment do 
    MyModel.find(1) 
    end 

但似乎在模型中的代碼不會被執行。我正在使用acts_as_audited,並且有一個很好的類函數可以檢索所有正在審計的模型。該調用看起來是這樣的:

Audit.audited_classes 

,並指定型號爲審計,您只需將此行添加到您的模型:

acts_as_audited 

當audited_classes在控制檯執行,我得到的數組我所有的審計課程;然而,當我從rake任務(或遷移)中執行它時,我得到一個空數組。

[編輯]

張望了一下打的多後,我注意到,如果模型沒有實際加載,直到他們被引用(即延遲加載)。我認爲在配置中將cache_classes設置爲true會解決這個問題,但它們似乎仍然被加載。

一種可能的解決方案是循環遍歷所有模型(如本文中所解釋的:Is there a way to get a collection of all the Models in your Rails app?),但這似乎有點冒失,我希望有一個更清晰的方法。

任何想法?

感謝

回答

1

您可以添加配置/環境/ development.rb:

Dir[Rails.root.join('app', 'models', '**/*')].each { |file| File.basename(file, '.rb').camelize.constantize } 
+0

是啊......我已經這樣做,但它的一劈......我提起了票這裏:https://github.com/rails/rails/issues/5148 – gmoniey 2012-04-10 02:11:25

+0

這不適用於名稱空間模型,我不認爲。你有沒有遇到名稱空間的用例? – jay 2014-03-13 10:13:59

1

發生這種情況時,你有config.threadsafe!在生產環境中,它會自動設置config.dependency_loading = false。這可以防止rails在rake任務期間加載模型類。

解決此問題的方法是在環境文件中設置「config.dependency_loading = true,如果$ rails_rake_task」。舉例來說,在我的production.rb我:

config.threadsafe! 
config.dependency_loading = true if $rails_rake_task 

,或者您也可以做

config.threadsafe! unless $rails_rake_task