Как мне получить список всех таблиц, определенных для базы данных, при использовании активной записи?
Как мне получить список всех таблиц, определенных для базы данных, при использовании активной записи?
Ответы:
Звоните 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
, а также реализации здесь:
Основываясь на двух предыдущих ответах, вы можете:
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, имейте в виду, что этот метод также будет возвращать 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
Этот код предполагает, что вы следуете стандартным соглашениям об именах моделей для классов и файлов исходного кода.
schema_migrations
таблица. Просто будь в курсе. Спасибо :)