2008-09-30 7 views

Respuesta

202

Llame 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", ...] 

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

+1

La lista también incluye la tabla 'schema_migrations'. Solo ten en cuenta. Gracias :) – imechemi

0

no sabe acerca de registro activo, pero aquí es una simple consulta:

seleccione nombre_tabla de INFORMATION_SCHEMA.TABLES donde TABLE_TYPE = 'Base de mesa'

2

Parece que debe haber una mejor manera , pero aquí es cómo 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 se supone que usted está siguiendo el modelo de convenio de nomenclatura estándar para las clases y los archivos de código fuente.

13

Sobre la base de las dos respuestas anteriores, se 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 mostrar cada modelo que abstrae una tabla, con el número de registros.

+1

para los fanáticos de línea única (sin la seguridad añadida de la coincidencia de tabla regex): (ActiveRecord :: Base.connection.tables - ['schema_migrations']). Map {| t | "# {t.classify} tiene # {t.classify.constantize.count} registros"} –

+1

¿Por qué usa una expresión regular aquí? ¿No funcionaría igual si "next if table == 'schema_migrations'"? – tbreier

Cuestiones relacionadas