rails中add_references和add_column之间的区别

时间:2017-11-22 09:12:31

标签: ruby-on-rails ruby foreign-keys

 add_reference :books, :author
 add_column :books, :author_id, :integer

这里添加引用将创建user_id列,add列也在books表中创建user_id列。它们之间有什么区别。使用引用而不是列有什么好处?

2 个答案:

答案 0 :(得分:2)

TLDR

#add_column用于添加类似名称的列。

#add_reference是指同时创建列,索引和外键的快捷方式。

解释

在您的示例中,唯一的区别是 #add_reference 创建的列上的 index ,默认为true

add_reference :books, :author
# equals
add_column :books, :author_id, :integer
add_index :books, :author_id

但是如果你采取以下行:

add_reference :books, :author, foreign_key: true

它还会创建一个外键约束。

此外,如果您希望每个作者只能发布一本书,您可以通过 #add_reference 设置唯一约束,方法如下:

add_reference :books, :author, null: false, index: {unique: true}, foreign_key: true

这要求每本书都有作者并限制作者最多只能有一本书。

通过执行以下操作,可以使用 #add_column 完成相同的操作:

add_column :books, :author_id, :integer, null: false
add_index :books, :author_id, unique: true
add_foreign_key :books, :authors

答案 1 :(得分:0)

运行迁移时,两者都会生成相同的列。

  

第一个命令在Book中添加了belongs_to:author关系   模型,而第二个没有。当这种关系是   如果指定,ActiveRecord将假定保留外键   author_id列,它将使用名为Author的模型   实例化特定作者。

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