web-dev-qa-db-ja.com

ActiveRecordが既存のテーブルインデックスを見つける

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

最初にschema.rbファイルをgrepしてインデックスを見つけました。これは最初は機能しましたが、すぐにこれが悪い戦略であることに気付きました。

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

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

36
Sean McCleary

これは、MySQL、SQLite3、およびPostgresで機能します。

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

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

また、使用中のアダプターを確認するには、次のようにします。

ActiveRecord::Base.connection.class
81
agregoire

よりクリーンな検査のための単なるアップデート。テーブルがたくさんあったので、特定のものを探すのが難しいと感じていました。

  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)
0
Jason Swett

複数のDBがあり、提案されたActiveRecord::Base.connection.indexes(table).inspectが他のDBを指しているために機能しない場合に備えて、これは、Railsコンソールで実行できます。

  • 気になるモデルを見つけましょう。「ユーザー」としましょう。
  • User.connection.indexes( "users")。inspect
  • 利益
0
Gang Peng