Como listar todas as tabelas definidas para o banco de dados ao usar o registro ativo?

126

Como obtenho uma lista de todas as tabelas definidas para o banco de dados ao usar o registro ativo?

Jay Stramel
fonte

Respostas:

259

Ligue ActiveRecord::ConnectionAdapters::SchemaStatements#tables. Este método não está documentado no adaptador MySQL, mas está documentado no adaptador PostgreSQL. SQLite / SQLite3 também possui o método implementado, mas não documentado.

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

Veja activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb:21, assim como as implementações aqui:

François Beausoleil
fonte
2
A lista também inclui schema_migrationstabela. Apenas esteja ciente. Obrigado :)
imechemi
ActiveRecord :: Base.connection pode ser preterido? apidock.com/rails/ActiveRecord/Base/connection Não vejo ActiveRecord :: Base.connection.tables listado lá.
Barlop
20

Com base nas duas respostas anteriores, você pode fazer:

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 listar todos os modelos que abstraem uma tabela, com o número de registros.

Thomas E
fonte
1
para os fanáticos de linha única (sem a segurança adicional da correspondência da tabela regex): (ActiveRecord :: Base.connection.tables - ['schema_migrations']). map {| t | "# # t.classify} possui # {t.classify.constantize.count} registros"}
Sascha Kaestle
1
Por que você usa uma regex aqui? "Next" se table == 'schema_migrations' "não funcionaria tão bem?
tbreier
12

Uma atualização para o Rails 5.2

Para o Rails 5.2, você também pode usar ApplicationRecordpara obter um nome da Arraysua tabela. Apenas, como mencionado imechemi, esteja ciente de que esse método também retornará ar_internal_metadatae schema_migrationsnessa matriz.

ApplicationRecord.connection.tables
Horacio
fonte
1

Parece que deveria haver uma maneira melhor, mas aqui está como eu resolvi meu 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 pressupõe que você está seguindo as convenções de nomenclatura de modelo padrão para classes e arquivos de código-fonte.

Jay Stramel
fonte
2
Ele também assume tudo no seu app / models / é um ativo modelo de registro
localhostdotdev
0

Não conhece o registro ativo, mas aqui está uma consulta simples:

selecione table_name em INFORMATION_SCHEMA.Tables em que TABLE_TYPE = 'BASE TABLE'

Kon
fonte