2010-07-14 6 views
11

Rails fait le modèle de chargement sur demande. Pour une tâche rake que j'écris, je dois pouvoir parcourir toutes les instances ActiveRecord::Base (ce qui est possible avec ActiveRecord::Base.send(:subclasses)). Cependant, pour que ce qui précède fonctionne, ils doivent déjà être chargés. Quelqu'un sait-il un moyen de forcer tous les modèles à charger? Idéalement, je voudrais ne pas avoir à passer par app/models depuis que je voudrais attraper des modèles ajoutés par des plugins.Comment puis-je forcer Rails à charger tous les modèles?

Répondre

12

rails 2:

Dir[Pathname(RAILS_ROOT) + 'app/models/**/*.rb'].each do |path| 
    require path 
end 

rails 3:

Dir[Rails.root + 'app/models/**/*.rb'].each do |path| 
    require path 
end 

une autre façon:

(ActiveRecord::Base.connection.tables - %w[schema_migrations]).each do |table| 
    table.classify.constantize rescue nil 
end 
+1

Problème avec cela est que, comme indiqué dans la question, cela ne sera pas attraper les modèles ajoutés par les plugins. Concrètement, l'un des cas les plus importants pour le plugin que j'écris est une boutique Spree, où fondamentalement aucun des modèles n'est dans 'app/models' – scotchi

+0

Il suffit d'ajouter' **/'au début de glob =>' Dir [Rails.root + '**/app/models/**/*. Rb'] ' – tig

+0

Cependant, pourquoi avez-vous besoin de passer en revue tous les modèles? – tig

26

je besoin tous les modèles chargés d'une tâche de râteau qui vérifie la validité de tous les dossiers , et trouvé la méthode pratique eager_load, qui peut être utilisé simplement comme ça:

Rails.application.eager_load!

+5

Je préfère vraiment cette réponse aux autres. C'est une façon beaucoup plus propre de faire les choses à mon avis. – taelor