ruby-on-rails - tabla - ruby on rails generate migration
¿Cómo manejo los nombres de índice demasiado largos en una migración de Ruby on Rails ActiveRecord? (5)
Estoy intentando 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 del í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?
Al igual que en la respuesta anterior: simplemente use la tecla ''nombre'' con su línea regular add_index:
def change
add_index :studies, :user_id, name: ''my_index''
end
En PostgreSQL, el límite predeterminado es de 63 caracteres . Debido a que los nombres de los índices deben ser únicos, es bueno tener una pequeña convención. Yo uso (pellizqué el ejemplo para explicar construcciones más complejas):
def change
add_index :studies, [:professor_id, :user_id], name: :idx_study_professor_user
end
El índice normal habría sido:
:index_studies_on_professor_id_and_user_id
La lógica sería:
-
index
convierte enidx
- Nombre de la mesa singular
- Sin palabras de unión
- No
_id
- Orden alfabetico
Lo que normalmente hace el trabajo.
Proporcione la opción :name
para add_index
, por ejemplo:
add_index :studies,
["user_id", "university_id", "subject_name_id", "subject_type_id"],
:unique => true,
:name => ''my_index''
Si utiliza la opción :index
en las references
en un bloque create_table
, tome las mismas opciones de hash que add_index
como su valor.
También puede cambiar el nombre del índice en las definiciones de columna dentro de un bloque create_table
(como el que obtiene del generador de migración).
create_table :studies do |t|
t.references :user, index: {:name => "index_my_shorter_name"}
end
Tambien puedes hacer
t.index([:branch_id, :party_id], unique: true, name: ''by_branch_party'')
como en la API de Ruby on Rails .