Como obtenho uma lista de todas as tabelas definidas para o banco de dados ao usar o registro ativo?
Como obtenho uma lista de todas as tabelas definidas para o banco de dados ao usar o registro ativo?
Respostas:
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:
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.
Uma atualização para o Rails 5.2
Para o Rails 5.2, você também pode usar ApplicationRecord
para obter um nome da Array
sua tabela. Apenas, como mencionado imechemi, esteja ciente de que esse método também retornará ar_internal_metadata
e schema_migrations
nessa matriz.
ApplicationRecord.connection.tables
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.
schema_migrations
tabela. Apenas esteja ciente. Obrigado :)