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?

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:


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.


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

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.


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'

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.