활성 레코드를 사용할 때 데이터베이스에 대해 정의 된 모든 테이블을 나열하는 방법은 무엇입니까?


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

ActiveRecord :: Base.connection이 더 이상 사용되지 않을 수 있습니까? apidock.com/rails/ActiveRecord/Base/connection 여기에 ActiveRecord :: Base.connection.tables가 표시되지 않습니다.
barlop

20

이전의 두 가지 답변을 바탕으로 다음을 수행 할 수 있습니다.

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} 레코드가"
샤샤 Kaestle

1
왜 정규식을 사용합니까? "table == 'schema_migrations'이면 다음에도 작동하지 않습니까?"
tbreier 2016 년

12

Rails 5.2 업데이트

레일 5.2 당신은 또한 사용할 수 있습니다 ApplicationRecord얻을 Array테이블 '이름을. imechemi가 언급 한 바와 같이 그냥,이 방법도 반환된다는 점에 유의 ar_internal_metadata하고 schema_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
그것은 또한 당신의 응용 프로그램 / 모델에서 모든 / 활성 기록 모델이다 가정
localhostdotdev

0

활성 레코드에 대해 모르지만 다음은 간단한 쿼리입니다.

INFORMATION_SCHEMA에서 table_name을 선택하십시오. TABLE_TYPE = 'BASE TABLE'

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.