uniqueness:scopeについて

今まで、uniquenessにscopeを使って、一意になる範囲を限定する方法を勉強したので記載していきます。

読者の皆様に少しでも参考になれば幸いです。

 

:scopeオプション

class Bookmark < ApplicationRecord
 validates :user_id, uniqueness: { scope: :board_id }
end

  :scopeオプションは、一意性チェックの範囲を限定してくれます。

つまり、:scopeをつけることで、1人のユーザーが、1つの掲示板に対して1いいねを押すことができるのです。

 

:scopeオプションを外すと

class Bookmark < ApplicationRecord
 validates :board_id, uniqueness: true
end
class Bookmark < ApplicationRecord
 validates :user_id, uniqueness: true
end

board_idとuser_idにそれぞれvalidatesをかけ、scope:オプションを外して、uniqueness: trueにすると結果はどうなると思いますか? boardは掲示板モデルです。

validates :board_id, uniqueness: trueの場合

board_idに対してuniqueness: trueをかけているので、1つの掲示板に対して1いいねしかつけることができません。 つまり、早い者勝ちになってしまい、1人のユーザーが最初にいいねを押すと、それ以上同じ掲示板に対していいねができなくなります。

validates :user_id, uniqueness: trueの場合

1人1回しか掲示板にいいねを押せなくなります。user_idに対してuniqueness: trueをかけているので、1人のユーザーが2回いいねを押してしまうと、validatesに引っかかってしまいます。

最後に

実際に自身のローカル環境で試してみてください。より理解が深まると思います。 最後まで読んでくださり、誠にありがとうございます。

参考URL

310nae.com