作成しているプラグインの移行ジェネレーターを作成しています。既存の一意のインデックスを変更して複合一意のインデックスにするために、テーブルにある一意のインデックスを見つける必要があります。 ActiveRecordを使用してテーブルのインデックスにアクセスする方法を見つけようとしています。 ActiveRecord :: ConnectionAdapters :: PostgreSQLAdapter :: indexesメソッドしか見つかりませんでしたが、残念ながら、これはPosgreSQLAdapterでのみ使用できます。他の主要なデータベースをサポートできる必要があります。
最初にschema.rbファイルをgrepしてインデックスを見つけました。これは最初は機能しましたが、すぐにこれが悪い戦略であることに気付きました。
ActiveRecordが複数のデータベースアダプターに対してこれを実行できる手段を提供しない場合、テーブルからインデックス情報を取得するためのアダプター固有のクエリを記述できる可能性があると考えていました。この方法に頼る必要がある場合、使用中のアダプターを判別するための良い方法は何でしょうか?
誰かがActiveRecordに理想的なテーブルインデックス情報をリストさせる方法を知っているなら。
これは、MySQL、SQLite3、およびPostgresで機能します。
ActiveRecord::Base.connection.tables.each do |table|
puts ActiveRecord::Base.connection.indexes(table).inspect
end
しかし、それはあなたが特別に作成したインデックスを提供するだけだと思います。
また、使用中のアダプターを確認するには、次のようにします。
ActiveRecord::Base.connection.class
よりクリーンな検査のための単なるアップデート。テーブルがたくさんあったので、特定のものを探すのが難しいと感じていました。
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
これは簡単なセットアップになります。
特定のテーブルのすべてのインデックスを表示したいだけの場合は、次のことができます。
ActiveRecord::Base.connection.indexes('my_table_name').map(&:name)
複数のDBがあり、提案されたActiveRecord::Base.connection.indexes(table).inspect
が他のDBを指しているために機能しない場合に備えて、これは、Railsコンソールで実行できます。