Wie erhalte ich eine Liste aller für die Datenbank definierten Tabellen, wenn ich einen aktiven Datensatz verwende?
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:
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
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
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.
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'