2009-08-26 6 views
7

J'ai une table avec un index composé qui n'a pas été créé via une migration de rails. Maintenant, j'ai besoin de créer une migration de rails qui va supprimer cet index et en créer un nouveau, mais je ne sais pas nécessairement quel sera le nom de l'index.Utiliser les migrations Rails pour supprimer un index sans connaître son nom

Je sais qu'il est possible d'obtenir une liste de noms de tables et de noms de colonnes dans une étape de migration. Est-il possible d'obtenir une liste de noms d'index sur une table particulière? Ou, en regardant d'une autre manière, est-il possible de supprimer tous les index sur une table? Ou est la seule option pour écrire mes propres requêtes SQL spécifiques à la base de données pour obtenir cette information?

Répondre

9

Vous pouvez obtenir des détails de tous les index sur une table avec:

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

Ce retourne un tableau de ActiveRecord::ConnectionAdapters::IndexDefinition objets, dont chacun a une méthode #name et #columns.

1

Vous pouvez obtenir les informations directement depuis la base de données. Si vous utilisez MySQL:

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

Il vous suffit de remplacer le your_database_name bits. Vous aurez besoin de privilèges pour la base de données information_schema (ou être connecté en tant que root).

+0

Cela semble être mysql spécifique; ça ne marche pas sur postgresql par exemple. Je pense que le PO essayait d'éviter cela. – Kelvin

3

Pour développer une grande réponse @ showaltb, voici une migration complète pour supprimer tous les index sur une table, sans connaître leurs noms:

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