2009-08-26 8 views
7

Tengo una tabla con un índice compuesto que no se creó mediante una migración de rieles. Ahora, necesito crear una migración de rieles que elimine este índice y cree uno nuevo, pero no necesariamente sé cuál será el nombre del índice.Usar migraciones de rieles para eliminar un índice sin conocer su nombre

Sé que es posible obtener una lista de nombres de tabla y columnas dentro de un paso de migración. ¿Es posible obtener una lista de nombres de índice en una tabla en particular? O, mirándolo de otra manera, ¿es posible eliminar todos los índices en una tabla? ¿O es la única opción para escribir mis propias consultas SQL específicas de la base de datos para obtener esta información?

Respuesta

9

Puede obtener detalles de todos los índices en una tabla con:

ActiveRecord::Base.connection.indexes('tablename') 

Esto devuelve una matriz de ActiveRecord::ConnectionAdapters::IndexDefinition objetos, cada uno de los cuales tiene un método #name y #columns.

1

Puede obtener la información directamente de la base de datos. Si estás usando MySQL:

>> select TABLE_NAME, INDEX_NAME from information_schema.statistics WHERE TABLE_SCHEMA = 'your_database_name'; 

Sólo es necesario reemplazar el your_database_name bits. Necesitará privilegios para la base de datos de información_schema (o iniciando sesión como raíz).

+0

Esto parece ser específica de MySQL; no funciona en postgresql, por ejemplo. Creo que el OP intentaba evitar esto. – Kelvin

3

Para ampliar gran respuesta de @ showaltb, aquí es una migración completa a eliminar todos los índices en una tabla, sin conocer sus nombres:

ActiveRecord::Base.connection.indexes('tablename').each do |index| 
    remove_index 'tablename', name: index.name 
end 
Cuestiones relacionadas