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?
11
A
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
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
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
Il suffit d'ajouter' **/'au début de glob =>' Dir [Rails.root + '**/app/models/**/*. Rb'] ' – tig
Cependant, pourquoi avez-vous besoin de passer en revue tous les modèles? – tig