web-dev-qa-db-ja.com

アクティブなレコードを使用するときに、データベースに定義されているすべてのテーブルのリストを表示するにはどうすればよいですか?

アクティブレコードを使用しているときに、データベースに定義されているすべてのテーブルのリストを取得するにはどうすればよいですか?

120
Jay Stramel

呼び出し ActiveRecord::ConnectionAdapters::SchemaStatements#tables 。このメソッドはMySQLアダプターでは文書化されていませんが、PostgreSQLアダプターでは文書化されています。 SQLite/SQLite3にもメソッドが実装されていますが、文書化されていません。

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

見る - activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb:21 、およびここでの実装:

245

前の2つの答えに基づいて、次のことができます。

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

テーブルを抽象化するすべてのモデルをレコード数とともにリストします。

16
Thomas E

Rails 5.2の更新

Rails 5.2の場合、ApplicationRecordを使用して、テーブルの名前でArrayを取得することもできます。ただ、imechemiが述べたように、このメソッドはreturn ar_internal_metadataおよびschema_migrationsその配列内。

ApplicationRecord.connection.tables
11
Horacio

より良い方法があるはずのようですが、ここに私の問題を解決した方法があります:

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

このコードは、クラスおよびソースコードファイルの標準モデル命名規則に従っていることを前提としています。

1
Jay Stramel

アクティブレコードについてはわかりませんが、簡単なクエリを次に示します。

tABLE_TYPE = 'BASE TABLE'のINFORMATION_SCHEMA.Tablesからtable_nameを選択します

0
Kon