2009-11-05 12 views
24

私は書いているプラ​​グインのための移行ジェネレータを書いています。既存のユニークインデックスを変更できるユニークインデックスを見つけることができるようにする必要があります。私は、ActiveRecordでテーブルのインデックスにアクセスする方法を見つけようとしています。私はActiveRecord :: ConnectionAdapters :: PostgreSQLAdapter :: indexesメソッドしか見つけられませんでしたが、残念ながらこれはPosgreSQLAdapterでのみ利用可能です。私は他の主要なデータベースをサポートできる必要があります。ActiveRecordは既存のテーブルインデックスを見つける

最初にschema.rbファイルをグレープしてインデックスを検索しましたが、これは最初はうまくいきましたが、すぐにこれは悪い戦略であることがわかりました。

ActiveRecordが複数のデータベースアダプタでこれを実行できる手段を提供していないと、テーブルからインデックス情報を取得するためにアダプタ固有のクエリを書くことができると私は考えていました。私がこの方法に頼る必要がある場合、使用中のアダプターを決定する良い方法は何でしょうか?

誰かが、ActiveRecordに理想的なテーブルインデックス情報をリストする方法を知っている場合。

+1

私は今、この権利を行うに考えることができる唯一の方法は、 のActiveRecordの助けを借りている:: SchemaDumper.dump 問題は、これが$のstdoutに現在のスキーマをダンプし、私はそれをキャプチャする方法がわからないということで、出力を文字列に変換します。私がそれを知っていれば、私はschema.rbを読むという最初のアプローチのコードを使用することができます。誰もブロックに書き込まれた何かのために$ stdoutをキャプチャする方法を知っていますか? たとえば、これはうまくいきません: schema_str = IO :: open(2){ActiveRecord :: SchemaDumper.dump} .read –

+0

この質問は古くからあると思いますが、まったく同じ問題があって、SchemaDumperをダンプする文字列。私は最終的に答えを見つけました。誰かがこの問題を抱えている場合に備えて投稿します: 'schema_rb_as_string = ActiveRecord :: SchemaDumper.dump(ActiveRecord :: Base.connection、StringIO.new).string' – MothOnMars

答えて

54

これは、MySQL、SQLite3の、とのPostgresで動作します:

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

しかし、私はそれだけであなたが特別に作成されたインデックスを与えると思います。また

、使用されているアダプタを見つけるために:

ActiveRecord::Base.connection.class 
+0

もpostgresで動作します – nikola

+0

ここにリンクがあります:http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/PostgreSQLAdapter.html#method-i-indexes – Juguang

12

クリーナー検査のためだけで更新を。テーブルがたくさんあるので、特定のものを探すのが難しいと思っていました。

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 

これはすばやく設定されます。

+1

これはすばらしい答えです。受け入れられた応答よりもはるかにクリーンです。 – Lorenz

+0

これはすばらしかった、ありがとう! – Aeramor

関連する問題