Вопрос помечен как mysql, но вы можете сделать это независимо от БД через ORM.
class DatabaseReport
def entry_counts
table_model_names.map do |model_name|
entity = model_name.constantize rescue nil
next if entity.nil?
{ entity.to_s => entity.all.count }
end.compact
end
private
def table_model_names
ActiveRecord::Base.connection.tables.map(&:singularize).map(&:camelize)
end
end
Обратите внимание, что при этом будут пропущены таблицы, для которых у вас нет сопоставления объектов, например метатаблицы типа ar_internal_metadata
или schema_migrations
. Он также не может вывести модели с областью действия (но может быть расширен для этого). Например. с Delayed::Job
я делаю это:
def table_model_names
ActiveRecord::Base.connection.tables.map(&:singularize).map(&:camelize) + ["Delayed::Job"]
end