Bagaimana cara mendapatkan daftar semua tabel yang ditentukan untuk database saat menggunakan catatan aktif?
Bagaimana cara mendapatkan daftar semua tabel yang ditentukan untuk database saat menggunakan catatan aktif?
Jawaban:
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:
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.
Pembaruan untuk Rails 5.2
Untuk Rails 5.2 Anda juga dapat menggunakan ApplicationRecord
untuk mendapatkan Array
nama tabel Anda. Hanya, seperti yang disebutkan imechemi, perlu diketahui bahwa metode ini juga akan kembali ar_internal_metadata
dan schema_migrations
dalam array itu.
ApplicationRecord.connection.tables
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.
schema_migrations
tabel. Berhati-hatilah. Terima kasih :)