问题描述
我有一个关于 Rails 6 和模型关联的问题,有或没有迁移。 让我说得更具体一点。 假设我们想在 users 表中放置一个外键,它链接到 course 表的 id 列。 我遇到的大多数教程和课程都遵循这条路线:
- 使用 add_column :users,:course_id,:integer 创建迁移
- 将has_one 或has_many 和belongs_to 放置到适当的模型中。 就是这样。
我的想法是,这个怎么样:
- 使用 add_reference :users,:course,foreign_key: true 创建迁移
- 将适当的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