Jak wyświetlić listę wszystkich tabel zdefiniowanych dla bazy danych podczas korzystania z aktywnego rekordu?


126

Jak uzyskać listę wszystkich tabel zdefiniowanych dla bazy danych podczas korzystania z aktywnego rekordu?

Odpowiedzi:


259

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:


2
Lista zawiera również schema_migrationstabelę. Po prostu bądź świadomy. Dzięki :)
imechemi

ActiveRecord :: Base.connection może być przestarzały? apidock.com/rails/ActiveRecord/Base/connection Nie widzę tam ActiveRecord :: Base.connection.tables.
barlop

20

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.


1
dla fanatyków jednowierszowych (bez dodatkowego zabezpieczenia dopasowania tabeli wyrażeń regularnych): (ActiveRecord :: Base.connection.tables - ['schema_migrations']). map {| t | „# {t.classify} ma # {t.classify.constantize.count} rekordy”}
Sascha Kaestle,

1
Dlaczego używasz tutaj wyrażenia regularnego? Czy opcja „next, jeśli table == 'schema_migrations'” nie działałaby równie dobrze?
tbreier

12

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

1

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.


2
Zakłada również, że wszystko w Twojej aplikacji / modelach / jest modelem aktywnego rekordu
localhostdotdev

0

Nie wiem o aktywnym rekordzie, ale oto proste zapytanie:

wybierz nazwę_tabeli z INFORMATION_SCHEMA.Tables, gdzie TABLE_TYPE = 'BASE TABLE'

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.