アクティブなレコードを使用しているときに、データベースに定義されているすべてのテーブルをリストする方法は?


126

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

回答:


259

を呼び出し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
リストにはschema_migrations表も含まれています。注意してください。ありがとう:)
imechemi 2017

ActiveRecord :: Base.connectionは廃止される可能性がありますか?apidock.com/rails/ActiveRecord/Base/connection ActiveRecord :: Base.connection.tablesが表示されません。
barlop 2018年

20

前の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

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


1
単一行の狂信者の場合(正規表現テーブルの一致の追加セキュリティなし):(ActiveRecord :: Base.connection.tables-['schema_migrations'])。map {| t | "#{t.classify}には#{t.classify.constantize.count}レコードがあります"}
Sascha Kaestle 2014

1
なぜここで正規表現を使用するのですか?「next if table == 'schema_migrations'」も同様に機能しませんか?
tbreier 2016年

12

Rails 5.2のアップデート

Rails 5.2の場合ApplicationRecordArrayを使用してテーブルの名前を取得することもできます。imechemiが述べたように、このメソッドも返さar_internal_metadataschema_migrations、その配列に含まれることに注意してください。

ApplicationRecord.connection.tables

1

より良い方法があるはずですが、これが私の問題を解決する方法です:

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

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


2
また、app / models /のすべてがアクティブレコードモデルであると想定しています
localhostdotdev

0

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

INFORMATION_SCHEMA.Tablesからtable_nameを選択します。ここでTABLE_TYPE = 'BASE TABLE'

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.