it-swarm.com.de

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

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

120
Jay Stramel

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

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

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

245

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.

16
Thomas E

Ein Update für Rails 5.2

Für Rails 5.2 können Sie auch ApplicationRecord verwenden, um ein Array mit den Namen Ihrer Tabelle zu erhalten. Wie imechemi bereits erwähnt, müssen Sie sich darüber im Klaren sein, dass diese Methode auch verwendet wird Rückkehr ar_internal_metadata und schema_migrations in diesem Array.

ApplicationRecord.connection.tables
11
Horacio

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

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

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

1
Jay Stramel

Ich weiß nichts über aktive Datensätze, aber hier ist eine einfache Abfrage:

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

0
Kon