Wie liste ich alle für die Datenbank definierten Tabellen auf, wenn ich einen aktiven Datensatz verwende?

126

Wie erhalte ich eine Liste aller für die Datenbank definierten Tabellen, wenn ich einen aktiven Datensatz verwende?

Jay Stramel
quelle

Antworten:

259

Rufen Sie an ActiveRecord::ConnectionAdapters::SchemaStatements#tables. Diese Methode ist im MySQL-Adapter nicht dokumentiert, im PostgreSQL-Adapter jedoch dokumentiert. In SQLite / SQLite3 ist die Methode ebenfalls implementiert, jedoch nicht dokumentiert.

>> ActiveRecord::Base.connection.tables
=> ["accounts", "assets", ...]

Siehe activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb:21sowie die Implementierungen hier:

François Beausoleil
quelle
2
Die Liste enthält auch eine schema_migrationsTabelle. Sei dir nur bewusst. Danke :)
imechemi
ActiveRecord :: Base.connection ist möglicherweise veraltet? apidock.com/rails/ActiveRecord/Base/connection Ich sehe dort keine ActiveRecord :: Base.connection.tables.
Barlop
20

Basierend auf den beiden vorherigen Antworten können Sie Folgendes tun:

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

um jedes Modell, das eine Tabelle abstrahiert, mit der Anzahl der Datensätze aufzulisten.

Thomas E.
quelle
1
für die einzeiligen Fanatiker (ohne die zusätzliche Sicherheit der Regex-Tabellenübereinstimmung): (ActiveRecord :: Base.connection.tables - ['schema_migrations']). map {| t | "# {t.classify} hat # {t.classify.constantize.count} Datensätze"}
Sascha Kaestle
1
Warum verwenden Sie hier einen regulären Ausdruck? Würde "next if table == 'schema_migrations'" nicht genauso gut funktionieren?
Tbreier
12

Ein Update für Rails 5.2

Für Rails 5.2 können Sie auch ApplicationRecordeinen Arraymit den Namen Ihrer Tabelle abrufen. Just, als imechemi erwähnt, beachten Sie, dass diese Methode auch zurückkehren ar_internal_metadataund schema_migrationsin diesem Array.

ApplicationRecord.connection.tables
Horacio
quelle
1

Es scheint, als gäbe es einen besseren Weg, aber hier ist, wie ich mein Problem gelöst habe:

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

Bei diesem Code wird davon ausgegangen, dass Sie die Standardkonventionen für Modellnamen für Klassen und Quellcodedateien befolgen.

Jay Stramel
quelle
2
Es wird auch davon ausgegangen, dass alles in Ihrer App / models / ein aktives Datensatzmodell ist
localhostdotdev
0

Ich weiß nichts über aktive Aufzeichnungen, aber hier ist eine einfache Abfrage:

Wählen Sie table_name aus INFORMATION_SCHEMA.Tables aus, wobei TABLE_TYPE = 'BASE TABLE'

Kon
quelle