2016-10-12 4 views
0

Я использую Rails 4.2.7 и PostGres 9.5. Я пытаюсь создать индекс trqm на моем столе (для облегчения поиска LIKE), поэтому я создал эту миграциюКак создать этот индекс PostGres в миграции Rails?

class AddTrqmIndexOnRaceTimes < ActiveRecord::Migration 
    def change 
    CREATE INDEX my_object_times_name_gin_trgm_idx ON my_object_times USING gin (name gin_trgm_ops); 
    end 
end 

Это приводит к следующей ошибке при запуске «грабли БД: мигрировать» ...

StandardError: An error has occurred, this and all later migrations canceled: 

undefined local variable or method `gin_trgm_ops' for #<AddTrqmIndexOnRaceTimes:0x007fdc34b40600> 
/Users/mikeb/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/migration.rb:664:in `block in method_missing' 
/Users/mikeb/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/migration.rb:634:in `block in say_with_time' 
/Users/mikeb/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/migration.rb:634:in `say_with_time' 
/Users/mikeb/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/migration.rb:654:in `method_missing' 
/Users/mikeb/Documents/workspace/runtrax/db/migrate/20161012185951_add_trqm_index_on_my_object_times.rb:3:in `change' 
/Users/mikeb/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/migration.rb:608:in `exec_migration' 
/Users/mikeb/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/migration.rb:592:in `block (2 levels) in migrate' 
/Users/mikeb/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/migration.rb:591:in `block in migrate' 
/Users/mikeb/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:292:in `with_connection' 
/Users/mikeb/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/migration.rb:590:in `migrate' 

Каков правильный способ создания этого индекса при миграции Rails?

ответ

0

Вы не можете добавить SQL непосредственно в метод ruby ​​change. Либо использовать метод add_index, или если вам нужно выйти за пределы возможностей помощника, использовать ActiveRecord, чтобы выполнить запрос, как это:

class AddTrqmIndexOnRaceTimes < ActiveRecord::Migration 
    def change 
    MyObjectTime.connection.execute("CREATE INDEX my_object_times_name_gin_trgm_idx ON my_object_times USING gin (name gin_trgm_ops);") 
    end 
end 
+0

Как использовать метод «add_index», чтобы выполнить тип индекса I указали в моем вопросе? –