Wie erhalte ich eine Liste aller für die Datenbank definierten Tabellen, wenn ich einen aktiven Datensatz verwende?
Wie erhalte ich eine Liste aller für die Datenbank definierten Tabellen, wenn ich einen aktiven Datensatz verwende?
Antworten:
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:21
sowie die Implementierungen hier:
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.
Ein Update für Rails 5.2
Für Rails 5.2 können Sie auch ApplicationRecord
einen Array
mit den Namen Ihrer Tabelle abrufen. Just, als imechemi erwähnt, beachten Sie, dass diese Methode auch zurückkehren ar_internal_metadata
und schema_migrations
in diesem Array.
ApplicationRecord.connection.tables
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.
schema_migrations
Tabelle. Sei dir nur bewusst. Danke :)