使用用户生成模型:引用vs user_id:整数

我很困惑如何生成属于另一个模型的模型。 我的书使用这个语法将Micropost和User相关联:

rails generate model Micropost user_id:integer 

但http://guides.rubyonrails.org/说这样做:

 rails generate model Micropost user:references 

这两个产生的迁移是不同的。 另外,对于前者,rails如何知道user_id是外键引用user ? 谢谢!

在运行迁移时,两者都会生成相同的列。 在轨道控制台中,您可以看到这种情况:

 :001 > Micropost => Micropost(id: integer, user_id: integer, created_at: datetime, updated_at: datetime) 

第二个命令在您的Micropost模型中添加一个belongs_to :user关系,而第一个命令不会。 当这个关系被指定时,ActiveRecord将假定外键保存在user_id列中,并且将使用名为User的模型来实例化特定用户。

第二个命令还在新的user_id列上添加一个索引。

rails如何知道user_id是外键引用user

Rails本身并不知道user_id是一个外键引用user 。 在第一个命令栏中rails generate model Micropost user_id:integer它只添加一列user_id但是rails不知道使用col。 您需要手动将一行放在Micropost模型中

 class Micropost < ActiveRecord::Base belongs_to :user end class User < ActiveRecord::Base has_many :microposts end 

关键字belongs_tohas_many确定这些模型之间的关系,并将user_id声明为User模型的外键。

后面的命令rails generate model Micropost user:referencesMicropost模型中添加行belongs_to :user ,并在此声明为外键。

FYI
使用前一种方法声明外键只能让Rails知道模型/表之间的关系。 数据库关于这个关系是未知的。 因此,当你使用MySql Workbench这样的软件生成EER图时,你会发现模型之间没有任何关系。 像在下面的图片 在这里输入图像说明

但是,如果使用后面的方法,则会发现您的迁移文件如下所示:

 def change create_table :microposts do |t| t.references :user, index: true t.timestamps null: false end add_foreign_key :microposts, :users 

现在外键被设置在数据库级别。 你可以生成适当的EER图。 在这里输入图像说明

对于前者,约定超过configuration。 Rails默认使用时引用另一个表

  belongs_to :something 

是寻找something_id

references ,或belongs_to实际上是较新的方式写几个怪癖前者。

重要的是要记住,它不会为你创build外键。 为了做到这一点,你需要明确地使用以下任一设置:

 t.references :something, foreign_key: true t.belongs_to :something_else, foreign_key: true 

或(注意复数):

 add_foreign_key :table_name, :somethings add_foreign_key :table_name, :something_elses`