Как получить список всех таблиц, определенных для базы данных при использовании активной записи?
Ответ 1
Вызвать 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
На основании двух предыдущих ответов вы можете сделать:
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
чтобы перечислить каждую модель, которая абстрагирует таблицу, с количеством записей.
Ответ 3
Кажется, должен быть лучший способ, но вот как я решил свою проблему:
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
Этот код предполагает, что вы следуете стандартным соглашениям об именах для классов и файлов исходного кода.
Ответ 4
Не знаю об активной записи, но вот простой запрос:
выберите имя_таблицы из INFORMATION_SCHEMA.Tables где TABLE_TYPE = 'BASE TABLE'