私は書いているプラグインのための移行ジェネレータを書いています。既存のユニークインデックスを変更できるユニークインデックスを見つけることができるようにする必要があります。私は、ActiveRecordでテーブルのインデックスにアクセスする方法を見つけようとしています。私はActiveRecord :: ConnectionAdapters :: PostgreSQLAdapter :: indexesメソッドしか見つけられませんでしたが、残念ながらこれはPosgreSQLAdapterでのみ利用可能です。私は他の主要なデータベースをサポートできる必要があります。ActiveRecordは既存のテーブルインデックスを見つける
最初にschema.rbファイルをグレープしてインデックスを検索しましたが、これは最初はうまくいきましたが、すぐにこれは悪い戦略であることがわかりました。
ActiveRecordが複数のデータベースアダプタでこれを実行できる手段を提供していないと、テーブルからインデックス情報を取得するためにアダプタ固有のクエリを書くことができると私は考えていました。私がこの方法に頼る必要がある場合、使用中のアダプターを決定する良い方法は何でしょうか?
誰かが、ActiveRecordに理想的なテーブルインデックス情報をリストする方法を知っている場合。
私は今、この権利を行うに考えることができる唯一の方法は、 のActiveRecordの助けを借りている:: SchemaDumper.dump 問題は、これが$のstdoutに現在のスキーマをダンプし、私はそれをキャプチャする方法がわからないということで、出力を文字列に変換します。私がそれを知っていれば、私はschema.rbを読むという最初のアプローチのコードを使用することができます。誰もブロックに書き込まれた何かのために$ stdoutをキャプチャする方法を知っていますか? たとえば、これはうまくいきません: schema_str = IO :: open(2){ActiveRecord :: SchemaDumper.dump} .read –
この質問は古くからあると思いますが、まったく同じ問題があって、SchemaDumperをダンプする文字列。私は最終的に答えを見つけました。誰かがこの問題を抱えている場合に備えて投稿します: 'schema_rb_as_string = ActiveRecord :: SchemaDumper.dump(ActiveRecord :: Base.connection、StringIO.new).string' – MothOnMars