2009-08-26 10 views
7

レールの移行では作成されなかった複合インデックスのテーブルがあります。今、私は、このインデックスを削除し、新しいインデックスを作成するレールの移行を作成する必要がありますが、私は必ずしもインデックスの名前が何であるかはわかりません。Railsの移行を使用して、名前を知らずにインデックスを削除します。

移行手順でテーブル名とカラム名のリストを取得できることがわかっています。特定のテーブルでインデックス名のリストを取得することは可能ですか?または、それを別の方法で見て、すべてのテーブルのインデックスを削除することは可能ですか?または、この情報を取得するために独自のデータベース固有のSQLクエリを作成する唯一のオプションですか?

答えて

9

あなたはしてテーブルの上にすべてのインデックスの詳細を取得することができます。これは、#name#columns方法をそれぞれ有するActiveRecord::ConnectionAdapters::IndexDefinitionオブジェクトの配列を返します

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

。 showaltbの偉大な答えは@に拡大すること

1

データベースから直接情報を取得できます。あなたがMySQLの使用している場合:

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

をあなただけyour_database_nameビットを交換する必要があります。 information_schemaデータベースの権限が必要です(またはrootとしてログインする必要があります)。

+0

これは、MySQL固有のようです。例えばpostgresqlでは動作しません。私はOPがこれを避けようとしていたと思う。 – Kelvin

3

は、ここに自分の名前を知らなくても、テーブルの上にすべてのインデックスを削除するための完全な移行です:

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