web-dev-qa-db-fra.com

Comment lister 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?

120
Jay Stramel

Appel 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:

245

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 répertorier chaque modèle qui résume une table, avec le nombre d'enregistrements.

16
Thomas E

Une mise à jour pour Rails 5.2

Pour Rails 5.2, vous pouvez également utiliser ApplicationRecord pour obtenir un Array avec les noms de votre table. Juste, comme l'a mentionné imechemi, sachez que cette méthode revenir ar_internal_metadata et schema_migrations dans ce tableau.

ApplicationRecord.connection.tables
11
Horacio

Il semble qu'il devrait y avoir une meilleure solution, 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.

1
Jay Stramel

Je ne connais pas l'enregistrement actif, mais voici une requête simple:

sélectionnez table_name dans INFORMATION_SCHEMA.Tables où TABLE_TYPE = 'BASE TABLE'

0
Kon