3

移行があります:

class AddGinIndexToContacts < ActiveRecord::Migration
  def up
    execute("CREATE INDEX contacts_search_idx ON contacts USING gin (first_name gin_trgm_ops, last_name gin_trgm_ops, name gin_trgm_ops)")
  end

  def down
    execute("DROP INDEX contacts_search_idx")
  end
end

次のコードを生成しますschema.rb

add_index "contacts", ["first_name", "last_name", "name"], name: "contacts_search_idx", using: :gin

その後、実行するrake db:schema:loadと間違ったSQLが生成されます:

CREATE  INDEX  "contacts_search_idx" ON "contacts" USING gin ("first_name", "last_name", "name")

まず、次のように述べています。

エラー: データ型文字の変化には、アクセス メソッド "gin" のデフォルトの演算子クラスがありません

第二に、失われてgin_trgm_opsいます。

それを機能させる方法は?

Rails 4.2

4

4 に答える 4

2

現在、次のopclassオプションを使用できます。

add_index :contacts, [:first_name, :last_name, :name], name: "contacts_search_idx", using: :gin, opclass: { first_name: :gin_trgm_ops, last_name: :gin_trgm_ops, name: :gin_trgm_ops }
于 2018-06-15T11:20:57.483 に答える
1

残念ながら、これはスキーマを sql に変更しない限り解決できません。いくつかのリンク:

Rails と Postgres Hstore: 移行でインデックスを追加できますか?

「gin」を使用するadd_indexが代わりに「btree」インデックスを作成するのはなぜですか?

スキーマ形式を sql に変更すると、正常に動作します。

于 2015-04-17T12:18:34.640 に答える