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 列。它们之间有什么区别。使用引用而不是列的优点是什么?
#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)