¿Por qué add_index usando 'gin' crea un índice 'btree' en su lugar?

Estoy enPostgreSQL 9.3.4 yRails 4.0.4.

Agrego una columna de "etiquetas" y el correspondientegin index (o, al menos, pido uno).

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

Verifique los resultados a través depsql:

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

Observe que el índice de "etiquetas" es de tipobtree - mientras que pedígin.

Ahora cree manualmente un índice para mostrar quegin está disponible:

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)

En efecto,gin está disponible.

Por el momento estoy usando estosolución alternativa con SQL sin formato, pero me gustaría saber por qué falla el enfoque típico anterior:

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

Tenga en cuenta que hay otro inconveniente!

Resulta quedb/schema.rb no tendrágin establecer como el tipo de índice:

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

Posible solución provisional:

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

¡Alerta!

Hasta que se solucione este error, debe revisar los cambios endb/schema.rb cada vez que realice una migración, ya que todas las futuras migraciones se eliminaránusing: :gin desde eladd_index línea.

Respuestas a la pregunta(1)

Su respuesta a la pregunta