web-dev-qa-db-ja.com

Rails 5が「インデックス」を「外部キー」に変更したのはなぜですか?

Rails 4:

t.references :event, index: true

これで、Rails 5。でindexの代わりにforeign_keyを使用できます。機能は同じままなので、なぜこれを行うことにしたのかよくわかりません。追加するのはインデックスであり、その列への外部キーではありません。

8
anemaria20

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

移行APIはRails 5-で変更されました

Rails 5は移行APIを変更しました。そのため、移行の実行時にnull: falseオプションがタイムスタンプに渡されなくても、タイムスタンプに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を実行すると

Rails4は生成します

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
29
Pramod Solanky

indexforeign_keyは、たとえRails 5であっても、異なる概念です。したがって、Rails 5が変更された」と言うのは誤りです。 「インデックス」から「外部キー」へ。

Rails 4からRails 5への変更は、indexオプションがデフォルトでtrueになることです。したがって、そうしません。明示的に設定する必要があります。

メソッド add_reference in Rails 4.2.5

:index

適切なインデックスを追加します。デフォルトはfalseです。


メソッド add_reference in Rails 5.2

:index

適切なインデックスを追加します。デフォルトはtrueです。このオプションの使用法については、add_indexを参照してください。

そのため、Rails 5の移行でreferencesを生成すると、デフォルトであるため、index: trueは表示されませんでした。

11
Stephen

foreign_keyindex は完全に異なるものです(名前から判断できるように)。

したがって、何も変更されていません。引き続き2つ使用できます。

移行での関連付けの確立に関する詳細については、 これらのドキュメント を確認してください。

5
Andrey Deineko