⛓️

【Rails】uniqueness: scope を使ってユニーク制約を設定する

2023/05/17に公開

uniqueness:scopeとは?

scopeを使ったユニーク制約は、Active Recordの機能の一つで、特定のスコープ内で重複する値を持つレコードを防止する制約を設定することができます。

使い方

例えば、Userモデルにemailカラムがある場合、scopeを使ってemailカラムの値が同じであるレコードが複数存在しないようにすることができます。以下は、Userモデルにおけるemailカラムのユニーク制約を設定する例です。

class User < ApplicationRecord
  validates :email, uniqueness: { scope: :account_id }
end

上記の例では、account_idスコープ内でemailカラムの値が重複するレコードが存在しないようになります。つまり、同じaccount_idを持つユーザーが同じメールアドレスを持つことができなくなります。

scopeは、複数のカラムに対して設定することもできます。例えば、以下のように複数のカラムを指定することができます。

class User < ApplicationRecord
  validates :email, uniqueness: { scope: [:account_id, :active] }
end

上記の例では、account_idactiveの両方が同じである場合に、emailカラムの値が重複するレコードが存在しないようになります。つまり、同じaccount_idかつactiveが同じ状態のユーザーが同じメールアドレスを持つことができなくなります。

参考資料

https://railsguides.jp/active_record_validations.html#uniqueness

Discussion