Pytanie w sprawie indexing, migration, ruby-on-rails, postgresql, hstore – Rails i Postgres Hstore: Czy możesz dodać indeks podczas migracji?

12

Mam migrację, w której tworzę tabelę produktów

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

      t.timestamps
    end
  end
end

Nastrona activerecord-postgres-hstore dodają indeks do tabeli (w SQL) za pomocą

CREATE INDEX products_gin_data ON products USING GIN(data);

Jednak zmiana ta nie jest śledzona przez migracje (domyślam się, ponieważ jest specyficzna dla Postgres?), Czy istnieje sposób na utworzenie indeksu z poziomu migracji?

dzięki!

Twoja odpowiedź

2   odpowiedź
15

Tak! Możesz dokonać kolejnej migracji i użyć metody „wykonaj” ... tak:

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

AKTUALIZACJA: Możesz także podać tę linię w config / application.rb:

config.active_record.schema_format = :sql

Możesz o tym przeczytać tutaj:http://apidock.com/rails/ActiveRecord/Base/schema_format/class

Idealne, dzięki za napiwekconfig.active_record.schema_format kreek
Możesz także użyć KONCURENTNIE na DROP. Cymen
Dodatkowo możesz to zrobić: UTWÓRZ INDEKS CONCURRENTLY products_gin_data NA produktach Z WYKORZYSTANIEM GIN (dane), co pozwoli mu nie blokować tabeli podczas dodawania indeksu. CraigKerstiens
27

W Rails 4 możesz teraz zrobić coś takiego podczas migracji:

    add_index :products, :data, using: :gin
podał mi to w mojej strukturze.sql (Rails 4.0.2): UTWÓRZ INDEKS index_products_on_data WŁĄCZ produkty przy użyciu gin (dane); mountriv99
To nie generuje GIN (dane). Może być błąd w generatorze. Autodidact

Powiązane pytania