Come posso ottenere un elenco di tutte le tabelle definite per il database quando utilizzo il record attivo?
Come posso ottenere un elenco di tutte le tabelle definite per il database quando utilizzo il record attivo?
Risposte:
Chiama ActiveRecord::ConnectionAdapters::SchemaStatements#tables
. Questo metodo non è documentato nell'adattatore MySQL, ma è documentato nell'adattatore PostgreSQL. Anche SQLite / SQLite3 ha implementato il metodo, ma non documentato.
>> ActiveRecord::Base.connection.tables
=> ["accounts", "assets", ...]
Vedi activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb:21
, oltre alle implementazioni qui:
Sulla base delle due risposte precedenti, potresti fare:
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
per elencare tutti i modelli che astraggono una tabella, con il numero di record.
Un aggiornamento per Rails 5.2
Per Rails 5.2 puoi anche usare ApplicationRecord
per ottenere un Array
con i nomi della tabella. Proprio, come ha detto imechemi, sii consapevole che anche questo metodo tornerà ar_internal_metadata
e schema_migrations
in quella matrice.
ApplicationRecord.connection.tables
Sembra che ci dovrebbe essere un modo migliore, ma ecco come ho risolto il mio 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
Questo codice presuppone che si stiano seguendo le convenzioni standard di denominazione del modello per classi e file di codice sorgente.
schema_migrations
tabella. Basta essere consapevoli. Grazie :)