2010-07-30 11 views
5

Ich weiß, dass Sie etwas tun können, um die Schienen-Umgebung zu laden:ActiveRecord Migration & Rake-Aufgaben laden keine Modelle?

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

Aber es scheint, den Code in den Modellen nicht ausgeführt. Ich benutze acts_as_audited, und es gibt eine nette Klassenfunktion, die alle Modelle, die auditiert werden, aufruft. Der Aufruf sieht so etwas wie:

Audit.audited_classes 

Und ein Modell zu spezifizieren als überprüfbare sein, geben Sie einfach die folgende Zeile in Ihre Modelle hinzu:

acts_as_audited 

Wenn audited_classes in der Konsole ausgeführt wird, erhalte ich eine Reihe von alle meine geprüften Klassen; Wenn ich es jedoch innerhalb einer Rake-Task (oder einer Migration) ausführe, erhalte ich ein leeres Array.

[EDIT]

Nach mehr um ein wenig zu spielen, habe ich bemerkt, dass, wenn die Modelle nicht tatsächlich geladen, bis sie (das heißt ein träges Laden) referenziert werden. Ich dachte, dass das Setzen von cache_classes auf true in der Config dies beheben würde, aber sie scheinen immer noch faul geladen zu sein.

Eine mögliche Lösung wäre, alle Modelle zu durchlaufen (wie in diesem Beitrag erläutert: Is there a way to get a collection of all the Models in your Rails app?), aber das scheint ein bisschen hacky, und ich hatte gehofft, es gibt einen saubereren Weg.

Irgendwelche Ideen?

Dank

Antwort

1

Sie können config/Umgebungen/development.rb hinzufügen:

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

Ja ... ich war schon das zu tun, aber es ist ein Hack ... reichte ich ein Ticket hier: https://github.com/rails/rails/issues/5148 – gmoniey

+0

dies funktioniert nicht mit Namespace-Modellen, ich glaube nicht. Hast du jemals einen Namespace-Usecase gefunden? – jay

1

Dies geschieht, wenn Sie config.threadsafe haben! in Produktionsumgebungen, die automatisch config.dependency_loading = false setzt. Dies verhindert, dass Schienen während Rake-Aufgaben Ihre Modellklassen laden.

Um dies zu umgehen, setzen Sie "config.dependency_loading = true if $ rails_rake_task" in Ihrer Umgebungsdatei. Zum Beispiel in meinem production.rb ich habe:

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

oder Sie tun können, auch

config.threadsafe! unless $rails_rake_task 
Verwandte Themen