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?

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:


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.


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

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.


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'

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.