Frage an migration, ruby-on-rails, indexing, hstore, postgresql – Rails and Postgres Hstore: Können Sie bei einer Migration einen Index hinzufügen?

12

Ich habe eine Migration, bei der ich eine Produkttabelle wie diese erstelle

class CreateProducts < ActiveRecord::Migration
  def change
    create_table :products do |t|
      t.string :name
      t.hstore :data

      t.timestamps
    end
  end
end

Auf deractiverecord-postgres-hstore Seite Sie fügen der Tabelle (in SQL) mit einen Index hinzu

CREATE INDEX products_gin_data ON products USING GIN(data);

Gibt es eine Möglichkeit, einen Index innerhalb einer Migration zu erstellen?

Vielen Dank!

Deine Antwort

2   die antwort
27

In Rails 4 können Sie jetzt in einer Migration so etwas tun:

    add_index :products, :data, using: :gin
gab mir dies in meiner structure.sql (Rails 4.0.2): CREATE INDEX index_products_on_data ON products USING gin (data); mountriv99
Dies erzeugt keine GIN (Daten). Könnte ein Fehler im Generator sein. Autodidact
15

Ja! Sie können eine weitere Migration durchführen und die Methode 'execute' verwenden ... wie folgt:

class IndexProductsGinData < ActiveRecord::Migration
  def up
    execute "CREATE INDEX products_gin_data ON products USING GIN(data)"
  end

  def down
    execute "DROP INDEX products_gin_data"
  end
end

AKTUALISIEREN: Möglicherweise möchten Sie diese Zeile auch in config / application.rb angeben:

config.active_record.schema_format = :sql

Hier können Sie darüber lesen:http://apidock.com/rails/ActiveRecord/Base/schema_format/class

Außerdem können Sie Folgendes festlegen: CREATE INDEX CONCURRENTLY products_gin_data ON products UNTER VERWENDUNG von GIN (Daten). Dadurch kann die Tabelle beim Hinzufügen des Index nicht gesperrt werden. CraigKerstiens
Sie können CONCURRENTLY auch für den DROP verwenden. Cymen
Perfekt, danke für den Tippconfig.active_record.schema_format kreek

Verwandte Fragen