Estoy confundido sobre cómo generar un modelo que pertenece a otro modelo. Mi libro usa esta sintaxis para asociar Micropost con el usuario:
rails generate model Micropost user_id:integer
pero http://guides.rubyonrails.org/ dice hacerlo así:
rails generate model Micropost user:references
Las migraciones generadas por estos 2 son diferentes. Además, para el primero, ¿cómo sabe Rails que se user_id
trata de una referencia de clave externa user
? ¡Gracias!
fuente
Rails en sí mismo no sabe que se
user_id
trata de una referencia de clave externauser
. En el primer comandorails generate model Micropost user_id:integer
solo agrega una columna,user_id
sin embargo, rails no conoce el uso de la columna. Necesita poner manualmente la línea en elMicropost
modelolas palabras clave
belongs_to
yhas_many
determinar la relación entre estos modelos y declararuser_id
como una clave externa paraUser
modelar.El comando posterior
rails generate model Micropost user:references
agrega la líneabelongs_to :user
en elMicropost
modelo y por la presente se declara como una clave foránea.Para su información,
declarar las claves foráneas utilizando el método anterior solo permite que los Rails sepan sobre la relación que tienen los modelos / tablas. La base de datos es desconocida sobre la relación. Por lo tanto, cuando genera los diagramas EER utilizando un software como el
MySql Workbench
que encuentra, no hay hilos de relación entre los modelos. Como en la siguiente fotoSin embargo, si utiliza el método posterior, encontrará que su archivo de migración se ve así:
Ahora la clave externa se establece en el nivel de la base de datos. y puedes generar
EER
diagramas adecuados .fuente
add_foreign_key
acción con una opciónforeign_key: true
a lat.references
línea, lo que implicaindex: true
. Así es ahorat.references :user, foreign_key: true
. Actualmente no hay documentación para laforeign_key
opción disponible, por lo que esta es solo mi suposición.add_reference
acción tiene una:foreign_key
opción que agrega una restricción de clave externa apropiada . Supongo que esta opción haría lo mismo al crear la tabla.add_foreign_key :microposts, :users
alguna diferencia para Rails?Para el primero, convención sobre configuración. Los rieles predeterminados cuando hace referencia a otra tabla con
es buscar
something_id
.references
, o enbelongs_to
realidad es una forma más nueva de escribir el primero con pocas peculiaridades.Es importante recordar que no creará claves foráneas para usted. Para hacer eso, debe configurarlo explícitamente usando:
o (tenga en cuenta el plural):
fuente
:polymorphic
opción (que en mi humilde opinión, en la mayoría de los casos, no es una buena idea). Si desea utilizar claves foráneas en ActiveRecord, use extranjero .add_foreign_key
ha llegado a ActiveRecord.