2012-05-14 9 views
11

tengo una migración en la creo una tabla de productos al igual queRails y Postgres Hstore: ¿Se puede agregar un índice en una migración?

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

     t.timestamps 
    end 
    end 
end 

Por activerecord-postgres-hstore page que añaden un índice para la tabla (en SQL) con

CREATE INDEX products_gin_data ON products USING GIN(data); 

No obstante que el cambio no se realiza un seguimiento por migraciones (supongo que porque es Postgres específico?), ¿hay alguna forma de crear un índice desde dentro de una migración?

gracias!

Respuesta

14

Sí! Puede realizar otra migración y utilizar el método de 'ejecutar' ... de este modo:

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 

ACTUALIZACIÓN: Usted también puede especificar esta línea en config/application.rb:

config.active_record.schema_format = :sql 

usted puede leer sobre ello aquí: http://apidock.com/rails/ActiveRecord/Base/schema_format/class

+0

Perfecto, gracias por la sugerencia sobre 'config.active_record.schema_format' – kreek

+3

Además, puede querer hacerlo: CREAR ÍNDICE CONCURRENTEMENTE products_gin_data EN PRODUCTOS UTILIZANDO GIN (datos) esto le permitiría no bloquear la tabla mientras agrega el índice. – CraigKerstiens

+0

También puede usar CONCURRENTEMENTE en DROP. – Cymen

26

en los carriles 4, ahora se puede hacer algo como esto en una migración:

add_index :products, :data, using: :gin 
+0

Esto no genera el GIN (datos). Podría ser un error en el generador. – Autodidact

+1

me dio esto en mi structure.sql (Rails 4.0.2): CREATE INDEX index_products_on_data ON productos que usan gin (datos); – mountriv99

Cuestiones relacionadas