【问题标题】:How do I create this specific PostGres index in a Rails migration?如何在 Rails 迁移中创建这个特定的 PostGres 索引?
【发布时间】:2017-02-21 17:15:44
【问题描述】:

我使用的是 Rails 4.2.7 和 PostGres 9.5。我正在尝试在我的表上创建一个 trqm 索引(以方便 LIKE 搜索)所以我创建了这个迁移

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

当我运行“rake db:migrate”时,这会导致以下错误……

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 迁移中创建此索引的正确方法是什么?

【问题讨论】:

    标签: ruby-on-rails postgresql indexing migration gwt-gin


    【解决方案1】:

    您不能直接在 ruby​​ 方法change 中添加 SQL。使用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
    

    【讨论】:

    • 如何使用“add_index”方法来执行我在问题中指定的索引类型?
    【解决方案2】:

    Rails 5 添加了对在表达式索引上指定运算符类的支持

    例如:

    def change
      add_index :patients, 'lower(last_name) varchar_pattern_ops', name: "index_patients_on_name_unique", unique: true
    end
    

    source

    【讨论】:

      【解决方案3】:

      您需要对您的代码稍作改动。将 sql 查询包装在 execute 中。

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

      【讨论】:

        猜你喜欢
        • 2018-01-31
        • 1970-01-01
        • 2017-10-03
        • 1970-01-01
        • 1970-01-01
        • 2015-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多