Jak uzyskać listę wszystkich tabel zdefiniowanych dla bazy danych podczas korzystania z aktywnego rekordu?
Jak uzyskać listę wszystkich tabel zdefiniowanych dla bazy danych podczas korzystania z aktywnego rekordu?
Odpowiedzi:
Zadzwoń ActiveRecord::ConnectionAdapters::SchemaStatements#tables. Ta metoda nie jest udokumentowana w adapterze MySQL, ale jest udokumentowana w adapterze PostgreSQL. SQLite / SQLite3 również ma zaimplementowaną metodę, ale nieudokumentowaną.
>> ActiveRecord::Base.connection.tables
=> ["accounts", "assets", ...]
Zobacz activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb:21, a także realizacje tutaj:
Na podstawie dwóch poprzednich odpowiedzi możesz:
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
aby wymienić wszystkie modele, które wyodrębniają tabelę, wraz z liczbą rekordów.
Aktualizacja dla Railsów 5.2
W Railsach 5.2 możesz także użyć, ApplicationRecordaby uzyskać znak Arrayz nazwami swoich tabel. Po prostu, jak wspomniała imechemi, pamiętaj, że ta metoda również zwróci ar_internal_metadatai schema_migrationsw tej tablicy.
ApplicationRecord.connection.tables
Wygląda na to, że powinien być lepszy sposób, ale oto jak rozwiązałem swój problem:
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
Ten kod zakłada, że postępujesz zgodnie ze standardowymi konwencjami nazewnictwa modeli dla klas i plików kodu źródłowego.
schema_migrationstabelę. Po prostu bądź świadomy. Dzięki :)