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


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.