¿Cómo hacer una lista de todas las tablas definidas para la base de datos cuando se usa el registro activo?

126

¿Cómo obtengo una lista de todas las tablas definidas para la base de datos cuando uso el registro activo?

Jay Stramel
fuente

Respuestas:

259

Llamar ActiveRecord::ConnectionAdapters::SchemaStatements#tables. Este método no está documentado en el adaptador MySQL, pero está documentado en el adaptador PostgreSQL. SQLite / SQLite3 también tiene el método implementado, pero no documentado.

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

Vea activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb:21, así como las implementaciones aquí:

François Beausoleil
fuente
2
La lista también incluye schema_migrationstabla. Solo ten en cuenta. Gracias :)
imechemi
ActiveRecord :: Base.connection puede estar en desuso? apidock.com/rails/ActiveRecord/Base/connection No veo ActiveRecord :: Base.connection.tables en la lista.
barlop
20

Según las dos respuestas anteriores, puede hacer:

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

para enumerar cada modelo que abstrae una tabla, con el número de registros.

Thomas E
fuente
1
para los fanáticos de una sola línea (sin la seguridad adicional de la coincidencia de la tabla de expresiones regulares): (ActiveRecord :: Base.connection.tables - ['schema_migrations']). map {| t | "# {t.classify} tiene # {t.classify.constantize.count} registros"}
Sascha Kaestle
1
¿Por qué usas una expresión regular aquí? ¿"Siguiente si table == 'schema_migrations'" no funcionaría igual de bien?
tbreier
12

Una actualización para Rails 5.2

Para Rails 5.2 también puede usar ApplicationRecordpara obtener un Arraycon los nombres de su tabla. Solo, como mencionó imechemi, tenga en cuenta que este método también regresará ar_internal_metadatay schema_migrationsen esa matriz.

ApplicationRecord.connection.tables
Horacio
fuente
1

Parece que debería haber una mejor manera, pero así es como resolví mi problema:

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

Este código supone que está siguiendo las convenciones de nomenclatura del modelo estándar para las clases y los archivos de código fuente.

Jay Stramel
fuente
2
También asume que todo en su aplicación / modelos / es un modelo de registro activo
localhostdotdev
0

No sé sobre el registro activo, pero aquí hay una consulta simple:

seleccione table_name de INFORMATION_SCHEMA. Tablas donde TABLE_TYPE = 'BASE TABLE'

Kon
fuente