tutorial software rails ejemplos descargar curso caracteristicas ruby-on-rails

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 un user 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`