rails中add_references和add_column的区别

Sur*_*esh 5 ruby ruby-on-rails foreign-keys

 add_reference :books, :author
 add_column :books, :author_id, :integer
Run Code Online (Sandbox Code Playgroud)

这里添加引用将创建 user_id 列,添加列也在书籍表中创建 user_id 列。它们之间有什么区别。使用引用而不是列的优点是什么?

3li*_*t0r 8

TLDR

#add_column用于添加顾名思义的列。

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

解释

在您的示例中,唯一的区别是将由#add_reference创建的列上的索引默认为。true

add_reference :books, :author
# equals
add_column :books, :author_id, :integer
add_index :books, :author_id
Run Code Online (Sandbox Code Playgroud)

但是,如果您采取以下行:

add_reference :books, :author, foreign_key: true
Run Code Online (Sandbox Code Playgroud)

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

此外,如果您希望每个作者只能出版一本书,您可以通过执行以下操作通过#add_reference设置唯一约束:

add_reference :books, :author, null: false, index: {unique: true}, foreign_key: true
Run Code Online (Sandbox Code Playgroud)

这要求每本书都有一个作者,并限制作者最多拥有一本书。

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

add_column :books, :author_id, :integer, null: false
add_index :books, :author_id, unique: true
add_foreign_key :books, :authors
Run Code Online (Sandbox Code Playgroud)