Comment puis-je obtenir une liste de toutes les tables définies pour la base de données lors de l'utilisation d'active record?
Réponses
Trop de publicités?Appelez ActiveRecord::ConnectionAdapters::SchemaStatements#tables
. Cette méthode n'est pas documenté dans la base de l'adaptateur, mais est documentée dans le PostgreSQL adaptateur. SQLite/SQLite3 a aussi la méthode mise en œuvre, mais sans papiers.
>> ActiveRecord::Base.connection.tables
=> ["accounts", "assets", ...]
Voir activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb:21
, ainsi que les implémentations ici:
Sur la base des deux réponses précédentes, vous pourriez faire:
ActiveRecord::Base.connection.tables.each do |table|
next if table.match(/\Aschema_migrations\Z/)
klass = table.singularize.camelize.constantize
puts "#{klass.name} has #{klass.count} records"
end
pour la liste de tous les modèles que les résumés d'une table, avec le nombre d'enregistrements.
Il semble qu'il devrait y avoir une meilleure façon, mais voici comment j'ai résolu mon problème:
Dir["app/models/*.rb"].each do |file_path|
require file_path # Make sure that the model has been loaded.
basename = File.basename(file_path, File.extname(file_path))
clazz = basename.camelize.constantize
clazz.find(:all).each do |rec|
# Important code here...
end
end
Ce code suppose que vous suivez le modèle standard des conventions de nommage pour les classes et les fichiers de code source.