##uniquenessとは
バリデーションの1つ。Railsで一意であることを示す。
scope
はuniquenessのオプション。
下記は人が投稿したものに対してブックマーク(いいね)機能を入れた時のmodel例。
1投稿に対して、1人のユーザーが1ブックマーク(いいね)しかすることができないため、このようなバリデーションになる。
models/bookmark.rb
class Bookmark < ApplicationRecord
belongs_to :user
belongs_to :board
validates :user_id, uniqueness: { scope: :board_id }
end
もしscope
を付与せずにいると、
models/bookmark.rb
validates :user_id, uniqueness: true
「1投稿」に対して「1ブックマーク(いいね)」しか付けることしか出来ず、早い者勝ちで一番最初に誰かがブックマーク(いいね)をしたら、それ以上その投稿にブックマーク(いいね)が付けれなくなる。
なのでブックマーク(いいね)機能搭載の時はuniqueness: scope
が必須と言える。
またuniqueness: scope
配列にして複数指定ができる。
models/bookmark.rb
validates :user_id, uniqueness: { scope: [:group_id, :board_id] }
これでboard_id
, group_id
, user_id
の全てが同じデータは1件しか作成できなくなる。