Rails中的add_foreign_key与add_reference

时间:2018-10-21 11:52:15

标签: ruby-on-rails ruby

rails中的“ add_foreign_key” “ add_reference” 方法有什么区别?

据Rails官方指南,我所了解的是它们都用于在两个表之间创建外键约束。

2 个答案:

答案 0 :(得分:6)

add_foreign_key-添加新的外键。 from_table是带有键列的表,to_table包含引用的主键。

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

什么是foreign key-外键是表中的一个字段或一组字段,可以唯一地标识另一个表中的行。

答案 1 :(得分:0)

注意:此答案基于Rails 6.0。)

总而言之,add_referenceRef)是add_indexchange_column_nulladd_foreign_keyRef不添加,默认情况下添加数据库级别的外键。因此,当您想实现足够简单的东西或(反过来?)多态引用时,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

以下是更详细的区别:

  1. add_reference的第二个参数是一个引用(没有_id的列名,因此通常是单数),而add_foreign_key的第二个参数是表名(因此通常是复数)。
  2. li>
  3. add_reference中,
      除非<{1}}选项指定为非nil,否则默认情况下不会创建
    1. 数据库级别外键
    2. foreign_key是默认设置,而索引在index: true中不相关
    3. add_foreign_key是默认设置(该列允许为空),与null: true无关。
  4. add_foreign_key仅在Rails中与polymorphic: true一起使用(它将在一个动作中创建2列; see Ref)。
  5. 尽管add_reference更具包容性,接受的选项范围更广,但两者之间接受的选项的格式完全不同。

两个示例现实用例

对于add_reference关联,禁止使用null:

has_one

当一个表有2个外键列到同一张表时:

add_reference :products, :merchant, null: false, index: {unique: true}, foreign_key: {on_delete: :cascade}