2016-09-29 96 views
4

如果你有这个Rails中4:为什么Rails 5将“索引”更改为“外键”?

t.references :event, index: true 

现在你可以使用foreign_key,而不是index在Rails的我真的不明白为什么他们决定这样做,因为功能保持不变,有什么你添加的是一个INDEX,而不是该列的FOREIGN KEY。

+3

老实说,我不要不理解你的问题,索引选项增加了一个数据库i ndex,外键加一个数据库外键。 –

回答

15

在导轨5 - 当我们引用一个模型,被自动创建的foreign_key索引。

迁移API在Rails的5已经改变 -

Rails的5改变了迁移API,因为其时的迁徙运行,那么不为空时自动添加时间戳即使null: false选项不传递给时间戳。

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

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

当您运行rails g model Task user:references

轨道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 
+0

非常详细的答案。但是,如果出于任何原因,我不希望该索引被索引?还是它仍然隐式地在Rails 4中索引,即使我只有't.references:user,foreign_key:true'? ---现在,我想知道他们为什么甚至没有忽略'foreign_key:true'。 –

4

foreign_keyindex是完全不同的东西(你可以从他们的名字判断)。

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

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