Как список всех таблиц, определенных для базы данных при использовании активной записи?

Как получить список всех таблиц, определенных для базы данных при использовании активной записи?

Ответ 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'