アクティブレコードを使用しているときに、データベースに定義されているすべてのテーブルのリストを取得するにはどうすればよいですか?
呼び出し 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
、およびここでの実装:
前の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
テーブルを抽象化するすべてのモデルをレコード数とともにリストします。
Rails 5.2の更新
Rails 5.2の場合、ApplicationRecord
を使用して、テーブルの名前でArray
を取得することもできます。ただ、imechemiが述べたように、このメソッドはreturn ar_internal_metadata
およびschema_migrations
その配列内。
ApplicationRecord.connection.tables
より良い方法があるはずのようですが、ここに私の問題を解決した方法があります:
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
このコードは、クラスおよびソースコードファイルの標準モデル命名規則に従っていることを前提としています。
アクティブレコードについてはわかりませんが、簡単なクエリを次に示します。
tABLE_TYPE = 'BASE TABLE'のINFORMATION_SCHEMA.Tablesからtable_nameを選択します