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?

Jay Stramel
źródło

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:

François Beausoleil
źródło
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.

Thomas E.
źródło
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
Horacio
źródło
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.

Jay Stramel
źródło
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'

Kon
źródło