rails中的“ add_foreign_key” 和“ add_reference” 方法有什么区别?
据Rails官方指南,我所了解的是它们都用于在两个表之间创建外键约束。
答案 0 :(得分:6)
add_foreign_key
-添加新的外键。 from_table
是带有键列的表,to_table
包含引用的主键。
add_reference
-是同时创建列,索引和外键的快捷方式。
什么是foreign key
-外键是表中的一个字段或一组字段,可以唯一地标识另一个表中的行。
答案 1 :(得分:0)
(注意:此答案基于Rails 6.0。)
总而言之,add_reference
(Ref)是add_index
,change_column_null
和add_foreign_key
( Ref)不添加,默认情况下添加数据库级别的外键。因此,当您想实现足够简单的东西或(反过来?)多态引用时,add_reference
很方便。如果没有,请使用add_foreign_key
,也可以结合使用显式add_index
。
作为一个简单的例子,这两个(我认为)彼此等效:
add_reference :articles, :author, foreign_key: true
add_foreign_key :articles, :authors
add_index :articles, :author_id
change_column_null :articles, :author_id, true
以下是更详细的区别:
add_reference
的第二个参数是一个引用(没有_id
的列名,因此通常是单数),而add_foreign_key
的第二个参数是表名(因此通常是复数)。add_reference
中,
foreign_key
是默认设置,而索引在index: true
中不相关add_foreign_key
是默认设置(该列允许为空),与null: true
无关。add_foreign_key
仅在Rails中与polymorphic: true
一起使用(它将在一个动作中创建2列; see Ref)。add_reference
更具包容性,接受的选项范围更广,但两者之间接受的选项的格式完全不同。对于add_reference
关联,禁止使用null:
has_one
当一个表有2个外键列到同一张表时:
add_reference :products, :merchant, null: false, index: {unique: true}, foreign_key: {on_delete: :cascade}