Rails 6 和模型关联和/或迁移

问题描述

我有一个关于 Rails 6 和模型关联的问题,有或没有迁移。 让我说得更具体一点。 假设我们想在 users 表中放置一个外键,它链接到 course 表的 id 列。 我遇到的大多数教程和课程都遵循这条路线:

  1. 使用 add_column :users,:course_id,:integer 创建迁移
  2. 将has_one 或has_many 和belongs_to 放置到适当的模型中。 就是这样。

我的想法是,这个怎么样:

  1. 使用 add_reference :users,:course,foreign_key: true 创建迁移
  2. 将适当的has_one/has_many 和belongs_to 放置到适当的模型中。

还是一样? 第二个选项不也创建索引,而第一个选项不创建索引吗?

哪个是最佳实践?

解决方法

add_reference 是作为 Rails 约定的一部分的快捷方式,在幕后,它将调用 add_column 和您指定的其他选项 [you can check the code for rails-6 here]

虽然不需要外键,但它们被认为是最佳实践,因为它们保证参照完整性。您可以在此处阅读更多相关信息https://edgeguides.rubyonrails.org/active_record_migrations.html#foreign-keys

还是一样?第二个选项不也创建索引,而第一个选项不创建索引吗?

话虽如此,即使它们的工作方式相同(它们实现相同的目标),您的 2 次迁移也不完全相同 - 第二个选项将默认添加索引,除非您指定不添加该选项 - 我绝对同意您关于使用 add_reference,因为这是一个更简单、更万无一失的快捷方式

当然,您也可以通过添加索引和外键使用您的第一次迁移手动实现这一点

add_column :users,:course_id,:integer
add_index :users,:course_id # uniq or not
add_foreign_key :courses,:users