Comment obtenir une liste de toutes les tables définies pour la base de données lors de l'utilisation de l'enregistrement actif?
Comment obtenir une liste de toutes les tables définies pour la base de données lors de l'utilisation de l'enregistrement actif?
Réponses:
Appelez ActiveRecord::ConnectionAdapters::SchemaStatements#tables. Cette méthode n'est pas documentée dans l'adaptateur MySQL, mais est documentée dans l'adaptateur PostgreSQL. SQLite / SQLite3 a également la méthode implémentée, mais non documentée.
>> 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 pouvez 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 lister chaque modèle qui fait abstraction d'une table, avec le nombre d'enregistrements.
Une mise à jour pour Rails 5.2
Pour Rails 5.2, vous pouvez également utiliser ApplicationRecordpour obtenir un Arrayavec les noms de votre table. Juste, comme imechemi l'a mentionné, sachez que cette méthode retournera également ar_internal_metadataet schema_migrationsdans ce tableau.
ApplicationRecord.connection.tables
Il semble qu'il devrait y avoir un meilleur moyen, 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 les conventions de dénomination de modèle standard pour les classes et les fichiers de code source.
schema_migrationstableau. Soyez juste conscient. Merci :)