2010-07-30 4 views
5

Je sais que vous pouvez faire quelque chose comme ceci pour charger l'environnement rails:Les tâches ActiveRecord Migration & Rake ne chargeant pas les modèles?

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

Mais il semble que le code dans les modèles ne sont pas exécutés. J'utilise acts_as_audited, et il y a une belle fonction de classe qui récupère tous les modèles qui sont audités. L'appel ressemble à:

Audit.audited_classes 

Et pour spécifier un modèle comme auditable, vous ajoutez simplement cette ligne à vos modèles:

acts_as_audited 

Lorsque audited_classes est exécuté dans la console, je reçois un tableau de toutes mes classes auditées; Cependant, lorsque je l'exécute à partir d'une tâche de rake (ou de migration), j'obtiens un tableau vide.

[EDIT]

Après avoir joué un peu plus, je remarque que si les modèles ne sont pas réellement chargés jusqu'à ce qu'ils soient référencés (à savoir le chargement paresseux). Je pensais que mettre les cache_classes à true dans la config réglerait cela, mais ils semblent toujours être paresseux chargés.

Une solution possible serait de faire défiler tous les modèles (comme expliqué dans cet article: Is there a way to get a collection of all the Models in your Rails app?), mais cela semble un peu hacky, et j'espérais qu'il y aurait une manière plus propre.

Des idées?

Merci

Répondre

1

Vous pouvez ajouter config/environnements/development.rb:

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

Oui ... Je faisais déjà, mais son hack ... j'ai déposé un billet ici: https://github.com/rails/rails/issues/5148 – gmoniey

+0

cela ne fonctionne pas avec les modèles à aires de noms, je ne pense pas. avez-vous déjà couru dans un usecase namespaced? – jay

1

Cela se produit lorsque vous avez config.threadsafe! dans les environnements de production, qui définit automatiquement config.dependency_loading = false. Cela empêche les rails de charger vos classes de modèle pendant les tâches de rake.

La façon de contourner cela est de définir "config.dependency_loading = true si $ rails_rake_task" dans votre fichier d'environnement. Par exemple, dans mon production.rb je:

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

ou vous pouvez également faire

config.threadsafe! unless $rails_rake_task 
Questions connexes