¿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.