Почему add_index с использованием 'gin' вместо этого создает индекс 'btree'?

Я наPostgreSQL 9.3.4 а такжеRails 4.0.4.

Я добавляю столбец «теги» и соответствующийgin индекс (или, по крайней мере, я прошу один).

class AddTagsToPhotos < ActiveRecord::Migration
  def change
    add_column :photos, :tags, :text, array: true, null: false, default: []
    add_index :photos, :tags, using: 'gin'
  end
end

Проверьте результаты с помощьюpsql:

psql=# \d photos
...
tags  | text[]  | not null default '{}'::text[]
Indexes:
    "index_photos_on_tags" btree (tags)

Обратите внимание, что индекс "теги" имеет типbtree - тогда как я просилgin.

Теперь вручную создайте индекс, чтобы показать, чтоgin доступен:

psql=# create index index_photos_on_tags2 on photos using gin(tags) ;

psql=# \d photos
Indexes:
    "index_photos_on_tags" btree (tags)
    "index_photos_on_tags2" gin (tags)

В самом деле,gin доступен.

Пока пользуюсь этимобходной путь с сырым SQL, но хотел бы знать, почему типичный подход выше не работает:

class AddTagsToPhotos < ActiveRecord::Migration
  def up
    add_column :photos, :tags, :text, array: true, null: false, default: []
    ActiveRecord::Base.connection.execute('create index index_photos_on_tags on photos using gin(tags) ;')
  end
  def down
    ActiveRecord::Base.connection.execute('drop index index_photos_on_tags')
    remove_column :photos, :tags
  end
end

Обратите внимание, что есть еще одна загвоздка!

Оказывается, чтоdb/schema.rb не будет иметьgin установить в качестве типа индекса:

add_index "photos", ["tags"], :name => "index_photos_on_tags"

Потенциальный временный обходной путь:

add_index "photos", ["tags"], :name => "index_photos_on_tags", using: :gin

Предупреждение!

Пока эта ошибка не исправлена, вы должны просмотреть изменения вdb/schema.rb всякий раз, когда вы запускаете миграцию, поскольку все будущие миграции будут лишеныusing: :gin отadd_index линия.

Ответы на вопрос(1)

Ваш ответ на вопрос