Aktif kayıt kullanılırken veritabanı için tanımlanan tüm tablolar nasıl listelenir?


126

Aktif kaydı kullanırken veritabanı için tanımlanan tüm tabloların bir listesini nasıl alırım?

Yanıtlar:


259

Çağrı ActiveRecord::ConnectionAdapters::SchemaStatements#tables. Bu yöntem MySQL bağdaştırıcısında belgelenmemiştir, ancak PostgreSQL bağdaştırıcısında belgelenmiştir. SQLite / SQLite3 de uygulanan, ancak belgelenmemiş yönteme sahiptir.

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

activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb:21Buradaki uygulamaların yanı sıra bakın :


2
Liste ayrıca schema_migrationstablo içerir . Sadece farkında olun. Teşekkürler :)
imechemi

ActiveRecord :: Base.connection kullanımdan kaldırılmış olabilir mi? apidock.com/rails/ActiveRecord/Base/connection Orada listelenen ActiveRecord :: Base.connection.tables göremiyorum.
barlop

20

Önceki iki cevaba göre şunları yapabilirsiniz:

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

bir tabloyu özetleyen her modeli kayıt sayısı ile listelemek için.


1
tek satırlı fanatikler için (düzenli ifade tablosu eşleşmesinin ek güvenliği olmadan): (ActiveRecord :: Base.connection.tables - ['schema_migrations']) map {| t | "# {t.classify}, # {t.classify.constantize.count} kayıtlara sahip"}
Sascha Kaestle

1
Neden burada normal ifade kullanıyorsunuz? "Sonraki tablo == 'schema_migrations'" da işe yaramaz mı?
tbreier

12

Rails 5.2 için bir güncelleme

Rails 5.2 ApplicationRecordiçin Array, tablonuzun adlarını almak için de kullanabilirsiniz . İmechemi belirtildiği gibi sadece, bu yöntem aynı zamanda dönecektir unutmayın ar_internal_metadatave schema_migrationsbu dizide.

ApplicationRecord.connection.tables

1

Görünüşe göre daha iyi bir yol olmalı, ama sorunumu şu şekilde çözdüm:

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

Bu kod, sınıflar ve kaynak kodu dosyaları için standart model adlandırma kurallarını izlediğinizi varsayar.


2
Ayrıca uygulamanızdaki / modellerinizdeki her şeyin etkin bir kayıt modeli olduğunu varsayar
localhostdotdev

0

Aktif kaydı bilmiyorum ama işte basit bir sorgu:

INFORMATION_SCHEMA'dan tablo_adı seçin. TABLE_TYPE = 'TABAN TABLOSU' olan tablolar

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.