add_reference :books, :author
add_column :books, :author_id, :integer
这里添加引用将创建user_id列,add列也在books表中创建user_id列。它们之间有什么区别。使用引用而不是列有什么好处?
答案 0 :(得分:2)
#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列上添加索引。