2009-11-05 9 views
24

Sto scrivendo un generatore di migrazione per un plug-in che sto scrivendo e devo essere in grado di trovare quali indici univoci ha una tabella in modo da poter modificare gli indici univoci esistenti per diventare un indice univoco composito. Ho cercato di trovare un modo per accedere a quali indici ha una tabella con ActiveRecord. Sono stato in grado di trovare il metodo ActiveRecord :: ConnectionAdapters :: PostgreSQLAdapter :: indexes, ma sfortunatamente questo è disponibile solo per PosgreSQLAdapter. Devo essere in grado di supportare gli altri principali database.ActiveRecord che trova gli indici di tabella esistenti

Prima di eseguire l'grepping del file schema.rb per trovare gli indici, questo ha funzionato all'inizio, ma presto ho capito che si trattava di una strategia sbagliata.

Stavo pensando che se ActiveRecord non fornisce un mezzo per essere in grado di farlo per più adattatori di database, potrei essere in grado di scrivere query specifiche dell'adattatore per recuperare le informazioni di indice da una tabella. Se ho bisogno di ricorrere a questo metodo quale sarebbe un buon modo per determinare l'adattatore in uso?

Se qualcuno conosce un modo per ottenere ActiveRecord per elencare le informazioni sull'indice della tabella che sarebbe l'ideale.

+1

L'unico modo che posso pensare di fare questo adesso è con l'aiuto di ActiveRecord :: SchemaDumper.dump Il problema è che questa discariche schema corrente a $ stdout e non so come catturare e che convertire l'output in una stringa. Se lo sapessi, sarei in grado di usare il codice dal mio primo approccio alla lettura di schema.rb. Qualcuno sa come catturare $ stdout per qualcosa che è stato scritto in un blocco? Ad esempio, questo non funziona: schema_str = IO :: open (2) {ActiveRecord :: SchemaDumper.dump} .read –

+0

Mi rendo conto che questa domanda è antica, ma ho avuto lo stesso identico problema cercando di far eseguire a SchemaDumper il dump di una stringa. Ho finalmente trovato la risposta e la posterò nel caso in cui qualcun altro abbia questo problema: 'schema_rb_as_string = ActiveRecord :: SchemaDumper.dump (ActiveRecord :: Base.connection, StringIO.new) .string' – MothOnMars

risposta

54

Questo funziona con MySQL, SQLite3, e Postgres:

ActiveRecord::Base.connection.tables.each do |table| 
    puts ActiveRecord::Base.connection.indexes(table).inspect 
end 

ma penso che si dà solo gli indici che specificamente creati.

Inoltre, per scoprire quale adattatore è in uso:

ActiveRecord::Base.connection.class 
+0

funziona anche con Postgres – nikola

+0

Ecco il link: http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/PostgreSQLAdapter.html#method-i-indexes – Juguang

12

Solo un aggiornamento per l'ispezione più pulito. Dato che avevo molti tavoli, trovavo difficile cercare articoli specifici.

ActiveRecord::Base.connection.tables.each do |table| 
    indexes = ActiveRecord::Base.connection.indexes(table) 
    if indexes.length > 0 
    puts "====> #{table} <====" 
    indexes.each do |ind| 
     puts "----> #{ind.name}" 
    end 
    puts "====> #{table} <====" 
    2.times{ puts ''} 
    end 
end 

Questa sarà una configurazione rapida.

+1

Questa è un'ottima risposta. Molto più pulito della risposta accettata. – Lorenz

+0

Questo è stato fantastico, grazie! – Aeramor

Problemi correlati