外部キー制約つきカラムにインデックスを貼る方法

2022.02.25

オーソドックスなやり方

indexオプション

class CreateTweets < ActiveRecord::Migration[5.2]
  def change
    create_table :tweets do |t|
      t.string    :text
      t.integer   :user_id, index: true #indexオプション
    end
  end
end

add_indexメソッド

class CreateTweets < ActiveRecord::Migration[5.0]
  def change
    create_table :tweets do |t|
      t.string    :text
      t.integer   :user_id
    end
    add_index :tweets, :user_id
    # add_index :対象のテーブル名, インデックス対象のカラム名
  end
end

2つの違いについて

外部キー制約つきカラムの場合

class CreateTweets < ActiveRecord::Migration[5.0]
  def change
    create_table :tweets do |t|
      t.string   :text
      t.integer  :user_id
    end
    add_foreign_key :tweets, :users
    # add_foreign_key :対象のテーブル名, :指定先のテーブル 
  end
end

reference型を使用しない場合、 foreign_key: trueでは外部キー制約にならないので注意。

reference型を使用する場合

class CreateTweets < ActiveRecord::Migration[5.0]
  def change
    create_table :tweets do |t|
      t.string     :text
      t.references :user, foreign_key: true
    end
  end
end

t.reference :userだけでは外部キー制約はつかないので、後ろに foreign_key: true を付ける。 インデックスは自動で付く。