2016-09-29 23 views
4

あなたがRailsの4でこれを持っていた場合:Rails 5が "インデックス"を "外部キー"に変更したのはなぜですか?

t.references :event, index: true 

は今、あなたは使用することができ、彼らがこれを行うことを決めた理由の機能は同じままなので、私は非常に、理解していないレール5のforeign_keyの代わりindex、どのような追加しているのはINDEXで、その列には外部キーではありません。

+3

I正直ドンを生成しますあなたの質問を理解していない、インデックスオプションは、データベースを追加するndex、外部キー1はデータベースの外部キーを追加します。 –

答えて

15

In Rails 5 - モデルを参照すると、foreign_keyのインデックスが自動的に作成されます。

移行APIは、Railsの5に変更されました -

Railsの5は、マイグレーションがnullではないが、自動的にタイムスタンプに追加された後に実行されたときにもかかわらずnull: falseオプションはタイムスタンプに渡されていないので、その移行APIを変更しました。

同様に、ほとんどの場合、参照される列のインデックスが必要です。だから、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 

とレール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

非常によく解答された答え。しかし、何らかの理由で参照をインデックスに登録したくない場合はどうすればよいですか?あるいは、私は 't.references:user、foreign_key:true'しか持っていなくても、それはRails 4で暗黙のうちに索引付けされましたか? ---そして今、私はなぜforeign_key:trueも省略しなかったのだろうかと思います。 –

4

indexは、(あなたの名前から判断できるように)全く異なるものです。

何も変更されていないので、まだ2つを使用できます。

these docsで、移行の関連付けを確立するための詳細を確認できます。

関連する問題