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ć, ApplicationRecord
aby uzyskać znak Array
z nazwami swoich tabel. Po prostu, jak wspomniała imechemi, pamiętaj, że ta metoda również zwróci ar_internal_metadata
i schema_migrations
w 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_migrations
tabelę. Po prostu bądź świadomy. Dzięki :)