Bagaimana daftar semua tabel yang ditentukan untuk database saat menggunakan catatan aktif?

126

Bagaimana cara mendapatkan daftar semua tabel yang ditentukan untuk database saat menggunakan catatan aktif?

Jay Stramel
sumber

Jawaban:

259

Panggil ActiveRecord::ConnectionAdapters::SchemaStatements#tables. Metode ini tidak berdokumen dalam adaptor MySQL, tetapi didokumentasikan dalam adaptor PostgreSQL. SQLite / SQLite3 juga memiliki metode yang diterapkan, tetapi tidak berdokumen.

>> ActiveRecord::Base.connection.tables
=> ["accounts", "assets", ...]

Lihat activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb:21, serta implementasinya di sini:

François Beausoleil
sumber
2
Daftar ini juga termasuk schema_migrationstabel. Berhati-hatilah. Terima kasih :)
imechemi
ActiveRecord :: Base.connection mungkin sudah usang? apidock.com/rails/ActiveRecord/Base/connection Saya tidak melihat ActiveRecord :: Base.connection.tables tercantum di sana.
barlop
20

Berdasarkan dua jawaban sebelumnya, Anda bisa melakukan:

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

untuk membuat daftar setiap model yang abstrak tabel, dengan jumlah catatan.

Thomas E
sumber
1
untuk fanatik baris tunggal (tanpa keamanan tambahan dari kecocokan tabel regex): (ActiveRecord :: Base.connection.tables - ['schema_migrations']). map {| t | "# {t.classify} memiliki # {t.classify.constantize.count} catatan"}
Sascha Kaestle
1
Mengapa Anda menggunakan regex di sini? Tidakkah "selanjutnya jika tabel == 'schema_migrations'" juga berfungsi?
tbreier
12

Pembaruan untuk Rails 5.2

Untuk Rails 5.2 Anda juga dapat menggunakan ApplicationRecorduntuk mendapatkan Arraynama tabel Anda. Hanya, seperti yang disebutkan imechemi, perlu diketahui bahwa metode ini juga akan kembali ar_internal_metadatadan schema_migrationsdalam array itu.

ApplicationRecord.connection.tables
Horacio
sumber
1

Sepertinya harus ada cara yang lebih baik, tetapi inilah cara saya memecahkan masalah saya:

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

Kode ini mengasumsikan bahwa Anda mengikuti konvensi penamaan model standar untuk kelas dan file kode sumber.

Jay Stramel
sumber
2
Ini juga mengasumsikan segala sesuatu di aplikasi Anda / model / adalah model rekaman aktif
localhostdotdev
0

Tidak tahu tentang catatan aktif, tapi ini pertanyaan sederhana:

pilih table_name dari INFORMATION_SCHEMA.Tabel tempat TABLE_TYPE = 'BASE TABLE'

Kon
sumber