Quiero hacer un migration
en Rails, haciendo referencia a otra tabla. Por lo general, haría algo como:
add_column :post, :user, :references
Esto crea una columna nombrada user_id
en la posts
tabla. Pero, ¿qué pasa si, en lugar de user_id
, quiero algo así author_id
? ¿Cómo puedo hacer eso?
schema_plus
gema,t.references :category, index: true, foreign_key: true, references: :match_categories
también funcionó para mí en el archivo de migración.Para rieles 5+
Definición inicial:
Si está definiendo su
Post
tabla de modelos, puede establecerreferences
,index
yforeign_key
en una línea:Actualización existente:
Si agrega referencias a una tabla existente, puede hacer esto:
Nota: El valor predeterminado para
index
es verdadero.fuente
null
s. 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.references
agregarforeign_key: true
, pero en este caso necesitará dos líneas.fuente
references: :users
opción en laadd_reference
llamada. 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
:references
realmente haga algo.schema_plus
gema durante años, y en realidad está agregando esa funcionalidad. Edité mi respuesta en consecuencia.t.references :col_name, references: other_table_name
funciona 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