为什么 Rails 5 将 "index" 更改为 "foreign key"?

Why did Rails 5 changed "index" to "foreign key"?

如果你在 Rails 4:

t.references :event, index: true

现在您可以在 Rails 中使用 foreign_key 而不是 index 5. 我不太明白为什么他们决定这样做,因为功能保持不变,什么您要添加的是索引,而不是该列的外键。

foreign_key and index是完全不同的东西(从名字就可以判断)。

所以什么都没有改变,你仍然可以使用两个。

您可以查看 these docs 以了解有关在迁移中建立关联的更多信息。

In Rails 5 - 当我们引用模型时,foreign_key 上的索引会自动创建。

迁移 API 已在 Rails 5 -

中更改

Rails 5 已更改迁移 API 因为即使 null: false 选项未传递给时间戳,当迁移 运行 时也会自动添加 not null时间戳。

同样,在几乎所有情况下,我们都需要引用列的索引。所以 Rails 5 不需要引用就有 index: true。当迁移 运行 时,会自动创建索引。

举个例子-(从http://blog.bigbinary.com/2016/03/01/migrations-are-versioned-in-rails-5.html复制)

当你运行rails g model Task user:references

Rails 4 将生成

class CreateTasks < ActiveRecord::Migration
  def change
    create_table :tasks do |t|
      t.references :user, index: true, foreign_key: true
      t.timestamps null: false
    end
  end
end

而 rails 5 会生成

class CreateTasks < ActiveRecord::Migration[5.0]
  def change
    create_table :tasks do |t|
      t.references :user, foreign_key: true
      t.timestamps
    end
  end
end

indexforeign_key 是不同的概念,即使在 Rails 5 中也是如此。所以说 rails 5 将“index”更改为“foreign”是错误的键”。

从Rails 4 到 Rails 5 的变化是index 选项默认为true,因此您无需显式设置。

rails 4.2.5

中的方法 add_reference

:index

Add an appropriate index. Defaults to false.


rails5.2

中的方法add_reference

:index

Add an appropriate index. Defaults to true. See add_index for usage of this option.

这就是为什么当您在 rails 5 迁移中生成 references 时,您没有看到 index: true,因为它是默认值。