今まで、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に引っかかってしまいます。
最後に
実際に自身のローカル環境で試してみてください。より理解が深まると思います。 最後まで読んでくださり、誠にありがとうございます。