type tabla remover relacion rails muchos modificar migrations generate column campos ruby-on-rails migration

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 en idx
  • 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 .