Quiero hacer un migrationen Rails, haciendo referencia a otra tabla. Por lo general, haría algo como:
add_column :post, :user, :referencesEsto crea una columna nombrada user_iden la poststabla. Pero, ¿qué pasa si, en lugar de user_id, quiero algo así author_id? ¿Cómo puedo hacer eso?

schema_plusgema,t.references :category, index: true, foreign_key: true, references: :match_categoriestambién funcionó para mí en el archivo de migración.Para rieles 5+
Definición inicial:
Si está definiendo su
Posttabla de modelos, puede establecerreferences,indexyforeign_keyen una línea:Actualización existente:
Si agrega referencias a una tabla existente, puede hacer esto:
Nota: El valor predeterminado para
indexes verdadero.fuente
nulls. Para no permitirlos, agregue la opción habitualnull: false.En Rails 4.2+ también puedes configurar claves foráneas en la base de datos, lo cual es una gran idea .
Para asociaciones simples, esto se puede hacer también al
t.referencesagregarforeign_key: true, pero en este caso necesitará dos líneas.fuente
references: :usersopción en laadd_referencellamada. No lo veo documentado en los documentos y parece funcionar de mi parte sin él.En los rieles 4, cuando usa postgresql y la gema schema_plus , puede escribir
Esto creará una columna
author_id, que se refiere correctamenteusers(id).Y en tu modelo, escribes
Tenga en cuenta que al crear una nueva tabla puede escribirla de la siguiente manera:
fuente
create_table:t.references :author, references: :users:referencesrealmente haga algo.schema_plusgema durante años, y en realidad está agregando esa funcionalidad. Edité mi respuesta en consecuencia.t.references :col_name, references: other_table_namefunciona sin instalar gemas adicionales.Si no está utilizando una clave foránea, no importa cuál sea el nombre real de la tabla de la otra tabla.
A partir de Rails 5 , si está utilizando una clave externa, puede especificar el nombre de la otra tabla en las opciones de clave externa. (ver https://github.com/rails/rails/issues/21563 para discusión)
Antes de Rails 5, debe agregar la clave externa como un paso separado:
fuente
{to_table: :users}alias_attribute (new_name, old_name) es muy útil. Simplemente cree su modelo y la relación:
luego edite el modelo y agregue un alias de atributo con
Después de eso podrás ejecutar cosas como
fuente