Estoy tratando de agregar un índice único que se crea a partir de las claves externas de cuatro tablas asociadas:
add_index :studies,
["user_id", "university_id", "subject_name_id", "subject_type_id"],
:unique => true
La limitación de la base de datos para el nombre del índice hace que la migración falle. Aquí está el mensaje de error:
El nombre de índice 'index_studies_on_user_id_and_university_id_and_subject_name_id_and_subject_type_id' en la tabla 'estudios' es demasiado largo; el límite es de 64 caracteres
¿Cómo puedo manejar esto? ¿Puedo especificar un nombre de índice diferente?
remove_index :studies, :name => 'my_index'
para cualquiera que la necesite4.2.6
trabaja conindex: { name: :my_index }
. Soloname
que no funcionó.También puede cambiar el nombre del índice en las definiciones de columna dentro de un
create_table
bloque (como el que obtiene del generador de migración).fuente
create_table
t.references :searchable, polymorphic:true, index: {:name => "index_searches_on_searchable"}
en este caso, el índice era de hecho una columna múltiple (searchable_id y searchable_type) y la adición del espacio de nombres en el nombre generado se hizo muy larga. .foreign_key: true
y, por cierto, esta es una gran solución, ya que es la más fácil de usar cuando tienes un archivo de migración creado con elmodel:references
formato generador de rielesEn PostgreSQL, el límite predeterminado es de 63 caracteres . Debido a que los nombres de índice deben ser únicos, es bueno tener una pequeña convención. Yo uso (modifiqué el ejemplo para explicar construcciones más complejas):
El índice normal habría sido:
La lógica sería:
index
se convierteidx
_id
Que generalmente hace el trabajo.
fuente
También puedes hacer
como en la API de Ruby on Rails .
fuente
Similar a la respuesta anterior: solo use la tecla 'nombre' con su línea regular add_index:
fuente
Me temo que ninguna de estas soluciones funcionó para mí. Quizás porque estaba usando
belongs_to
en mi migración create_table para una asociación polimórfica.Agregaré mi código a continuación y un enlace a la solución que me ayudó en caso de que alguien más se tope al buscar 'El nombre del índice es demasiado largo' en relación con las asociaciones polimórficas.
El siguiente código NO me funcionó:
Este código me funcionó:
Estas son las preguntas y respuestas de SO que me ayudaron: https://stackoverflow.com/a/30366460/3258059
fuente
Tuve este problema, pero con la
timestamps
función. Generaba automáticamente un índice en updated_at que excedía el límite de 63 caracteres:Traté de usar
timestamps
para especificar el nombre del índice:Sin embargo, esto intenta aplicar el nombre de índice a los campos
updated_at
ycreated_at
:Finalmente me di por vencido
timestamps
y creé las marcas de tiempo en el largo camino:¡Esto funciona pero me encantaría saber si es posible con el
timestamps
método!fuente
create_table: you_table_name do | t | t.references: studant, index: {name: 'name_for_studant_index'} t.references: teacher, index: {name: 'name_for_teacher_index'} end
fuente
Tengo un proyecto que usa mucho los generadores y necesitaba que esto fuera automático, así que copié la
index_name
función de la fuente de rieles para anularla. Agregué esto enconfig/initializers/generated_index_name.rb
:Crea índices como
ix_assignments_on_case_id__project_id
y simplemente lo trunca a 63 caracteres si aún es demasiado largo. Eso seguirá siendo no único si el nombre de la tabla es muy largo, pero puede agregar complicaciones como acortar el nombre de la tabla por separado de los nombres de las columnas o verificar la unicidad.Tenga en cuenta que esto es de un proyecto Rails 5.2; Si decide hacer esto, copie la fuente de su versión.
fuente