Come elencare tutte le tabelle definite per il database quando si utilizza il record attivo?


126

Come posso ottenere un elenco di tutte le tabelle definite per il database quando utilizzo il record attivo?

Risposte:


259

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:


2
L'elenco include anche la schema_migrationstabella. Basta essere consapevoli. Grazie :)
imechemi,

ActiveRecord :: Base.connection potrebbe essere obsoleto? apidock.com/rails/ActiveRecord/Base/connection Non vedo ActiveRecord :: Base.connection.tables elencato lì.
barlop

20

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.


1
per i fanatici a linea singola (senza la sicurezza aggiuntiva della corrispondenza della tabella regex): (ActiveRecord :: Base.connection.tables - ['schema_migrations']). map {| t | "# {t.classify} ha # {t.classify.constantize.count} record"}
Sascha Kaestle,

1
Perché usi una regex qui? "Next if table == 'schema_migrations'" non funzionerebbe altrettanto bene?
martedì

12

Un aggiornamento per Rails 5.2

Per Rails 5.2 puoi anche usare ApplicationRecordper ottenere un Arraycon i nomi della tabella. Proprio, come ha detto imechemi, sii consapevole che anche questo metodo tornerà ar_internal_metadatae schema_migrationsin quella matrice.

ApplicationRecord.connection.tables

1

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.


2
Presuppone anche che tutto nella tua app / modelli / sia un modello di record attivo
localhostdotdev

0

Non conosci il record attivo, ma ecco una semplice query:

seleziona table_name da INFORMATION_SCHEMA.Tables dove TABLE_TYPE = 'BASE TABLE'

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.