2009-11-05 21 views
24

Estoy escribiendo un generador de migración para un complemento que estoy escribiendo y necesito poder encontrar qué índices únicos tiene una tabla para poder modificar índices únicos existentes para convertirme en un índice único compuesto. He estado intentando encontrar una forma de acceder a los índices que tiene una tabla con ActiveRecord. Solo he podido encontrar el método ActiveRecord :: ConnectionAdapters :: PostgreSQLAdapter :: indexes, pero desafortunadamente esto solo está disponible para el PosgreSQLAdapter. Necesito poder apoyar las otras bases de datos importantes.ActiveRecord encontrando índices de tabla existentes

Primero grepping el archivo schema.rb para encontrar los índices, esto funcionó al principio, pero pronto me di cuenta de que esta era una mala estrategia.

Estaba pensando que si ActiveRecord no proporciona un medio para poder hacer esto para múltiples adaptadores de bases de datos, es posible que pueda escribir consultas específicas del adaptador para recuperar la información del índice de una tabla. Si necesito recurrir a este método, ¿cuál sería una buena forma de determinar el adaptador en uso?

Si alguien sabe de una forma de obtener ActiveRecord para listar la tabla de información de índice que sería ideal.

+1

La única manera que puedo pensar para hacer esto ahora mismo es con la ayuda de ActiveRecord :: SchemaDumper.dump El problema es que esta vuelca el esquema actual de $ stdout y no sé cómo capturar eso y convierte la salida en una cadena. Si lo supiera, podría usar el código de mi primer enfoque de lectura de schema.rb. ¿Alguien sabe cómo capturar $ stdout por algo que se escribió en un bloque? Por ejemplo, esto no funciona: schema_str = IO :: open (2) {ActiveRecord :: SchemaDumper.dump} .read –

+0

Me doy cuenta de que esta pregunta es antigua, pero tuve el mismo problema al tratar de hacer que SchemaDumper volcara a una cuerda. Finalmente encontré la respuesta, y la publicaré en caso de que alguien más tenga este problema: 'schema_rb_as_string = ActiveRecord :: SchemaDumper.dump (ActiveRecord :: Base.connection, StringIO.new) .string' – MothOnMars

Respuesta

54

Esto funciona con MySQL, SQLite3, y Postgres:

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

Pero creo que sólo le da los índices que ha creado específicamente.

Además, para averiguar qué adaptador está en uso:

ActiveRecord::Base.connection.class 
+0

funciona también con postgres – nikola

+0

Aquí está el enlace: http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/PostgreSQLAdapter.html#method-i-indexes – Juguang

12

Apenas una actualización para su inspección más limpio. Como tenía muchas mesas, me resultaba difícil buscar productos específicos.

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 

Esto será de configuración rápida.

+1

Esta es una gran respuesta. Mucho más limpio que la respuesta aceptada. – Lorenz

+0

Esto fue genial, gracias! – Aeramor

Cuestiones relacionadas