How to list of all the tables defined for the database when using active record?

Call ActiveRecord::ConnectionAdapters::SchemaStatements#tables. This method is undocumented in the MySQL adapter, but is documented in the PostgreSQL adapter. SQLite/SQLite3 also has the method implemented, but undocumented.

>> ActiveRecord::Base.connection.tables
=> ["accounts", "assets", ...]

See activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb:21, as well as the implementations here:

  • activerecord/lib/active_record/connection_adapters/mysql_adapter.rb:412
  • activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb:615
  • activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb:176

Based on the two previous answers, you could do:

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

to list every model that abstracts a table, with the number of records.