忘備録

日々の調べ物をまとめる。アウトプットする。基本自分用。

【 Ruby on Rails】一意制約

どうやって一意制約を設けるか。

軽くググるとふたつの方法

[Rails]マイグレーション時にUNIQUEインデックスを設定する方法(単体・複数の場合) – hello-world.jp.net

ActiveRecord4のバリデーションで複数カラムにユニーク制約を付ける方法

SchemaStatements#add_index を使う

add_index :users, [:user_id, :event_id], unique: true

TableDefinition#index を使う

create_table :invited_users do |t|
  t.references :user, foreign_key: true
  t.references :event, foreign_key: true

  t.timestamps

  t.index [:user_id, :event_id], unique: true
end

一意制約キーの名称について

TableDefinition#indexにもSchemaStatements#add_indexにもnameオプションがあり一意制約キーの名称を付けることができる。

nameオプションは省略可能で、以下のフォーマットで命名される。

{テーブル名}_on_{カラム名}_and_{カラム名}...

例)invited_usersテーブルにuser_idカラムとevent_idカラムで一意制約を設けた場合

index_invited_users_on_user_id_and_event_id

長いですね、、、

カラムが2つならまだいいですが、3つ、4つと増える場合は、nameオプションを利用して明示的に命名してあげたほうが良さそうです。