Як перелічити всі таблиці, визначені для бази даних при використанні активного запису?


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.
— барлоп

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']) карта {| t | "# {t.classify} має # {t.classify.constantize.count} записів"}
— Саша Кастл

1
Для чого ви використовуєте тут регулярний вираз? Чи не "наступний, якщо таблиця ==" schema_migrations "" працює так само добре?
— tbreier

12

Оновлення для Rails 5.2

Для Rails 5.2 ви також ApplicationRecordможете отримати Arrayімена таблиці. Просто, як згадано ім'ямі, пам’ятайте, що цей метод також повернеться 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.Tables where TABLE_TYPE = 'BASE TABLE'

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.