Comment lister toutes les tables définies pour la base de données lors de l'utilisation de l'enregistrement actif?


126

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:


259

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:


2
La liste comprend également un schema_migrationstableau. Soyez juste conscient. Merci :)
imechemi

ActiveRecord :: Base.connection est peut-être obsolète? apidock.com/rails/ActiveRecord/Base/connection Je ne vois pas ActiveRecord :: Base.connection.tables répertorié ici.
barlop

20

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.


1
pour les fanatiques d'une seule ligne (sans la sécurité supplémentaire de la correspondance de la table regex): (ActiveRecord :: Base.connection.tables - ['schema_migrations']). map {| t | "# {t.classify} a # {t.classify.constantize.count} enregistrements"}
Sascha Kaestle

1
Pourquoi utilisez-vous une regex ici? "Next if table == 'schema_migrations'" ne fonctionnerait-il pas aussi bien?
tbreier

12

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

1

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.


2
Il suppose également que tout dans votre application / modèles / est un modèle d'enregistrement actif
localhostdotdev

0

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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.