ruby on rails - software - generar modelo usando user: references vs user_id: integer
ruby on rails tutorial (3)
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 que lo haga así:
rails generate model Micropost user:references
Las migraciones generadas por estos 2 son diferentes. Además, para el primero, ¿cómo sabe el rails que user_id
es un user
referencia de clave externa? ¡Gracias!
¿Cómo sabe los rieles que
user_id
es unuser
referencia de clave externa?
Rails en sí mismo no sabe que user_id
es un user
referencia de clave externa. En el primer comando, los rails generate model Micropost user_id:integer
, solo agrega una columna user_id
pero rails no conoce el uso del col. Micropost
colocar manualmente la línea en el modelo de Micropost
class Micropost < ActiveRecord::Base
belongs_to :user
end
class User < ActiveRecord::Base
has_many :microposts
end
las palabras clave belongs_to
y has_many
determinan la relación entre estos modelos y declaran user_id
como una clave externa al modelo de User
.
Los rails generate model Micropost user:references
comando posteriores rails generate model Micropost user:references
agrega la línea belongs_to :user
en el modelo de Micropost
y declara como una clave foránea.
FYI
Al declarar las claves foráneas utilizando el método anterior solo se permite que los Rails conozcan 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 usando software como MySql Workbench
, encuentra que no hay hilos de relación dibujados entre los modelos. Como en la siguiente foto
Sin embargo, si usa el método posterior, verá que su archivo de migración se ve así:
def change
create_table :microposts do |t|
t.references :user, index: true
t.timestamps null: false
end
add_foreign_key :microposts, :users
Ahora la clave externa se establece en el nivel de la base de datos. y puede generar diagramas de EER
apropiados.
Ambos generarán las mismas columnas cuando ejecute la migración. En la consola de rieles, puede ver que este es el caso:
:001 > Micropost
=> Micropost(id: integer, user_id: integer, created_at: datetime, updated_at: datetime)
El segundo comando agrega una relación belongs_to :user
en su modelo de Micropost mientras que el primero no. Cuando se especifica esta relación, ActiveRecord supondrá que la clave externa se mantiene en la columna user_id
y utilizará un modelo denominado User
para crear una instancia del usuario específico.
El segundo comando también agrega un índice en la nueva columna user_id
.
Para el primero, convención sobre configuración. Rails predeterminado cuando hace referencia a otra tabla con
belongs_to :something
es buscar something_id
.
references
, o belongs_to
es en realidad una forma más nueva de escribir el primero con algunas peculiaridades.
Importante es recordar que no creará claves foráneas para usted. Para hacer eso, necesitas configurarlo explícitamente usando:
t.references :something, foreign_key: true
t.belongs_to :something_else, foreign_key: true
o (observe el plural):
add_foreign_key :table_name, :somethings
add_foreign_key :table_name, :something_elses`