Почему 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
линия.