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_idtrata de una referencia de clave externa user? ¡Gracias!
fuente

Rails en sí mismo no sabe que se
user_idtrata de una referencia de clave externauser. En el primer comandorails generate model Micropost user_id:integersolo agrega una columna,user_idsin embargo, rails no conoce el uso de la columna. Necesita poner manualmente la línea en elMicropostmodelolas palabras clave
belongs_toyhas_manydeterminar la relación entre estos modelos y declararuser_idcomo una clave externa paraUsermodelar.El comando posterior
rails generate model Micropost user:referencesagrega la líneabelongs_to :useren elMicropostmodelo 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 Workbenchque 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
EERdiagramas adecuados .fuente
add_foreign_keyacción con una opciónforeign_key: truea lat.referenceslínea, lo que implicaindex: true. Así es ahorat.references :user, foreign_key: true. Actualmente no hay documentación para laforeign_keyopción disponible, por lo que esta es solo mi suposición.add_referenceacción tiene una:foreign_keyopció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, :usersalguna 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_torealidad 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
:polymorphicopció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_keyha llegado a ActiveRecord.