ブックマークを一回限りにするには?

scopeオプションで、一意性チェックの範囲を絞り込む属性を指定する。

  class Bookmark < ApplicationRecord
    belongs_to :user
    belongs_to :article

    validates :user_id, uniqueness: { scope: :article_id }
  end

一つのarticle_idでレコードを絞り込み、その中でuser_idのuniquenessを検証するイメージ。ユーザーと記事の組み合わせが一意になるので、あるユーザーがある記事をブックマークできるのは一回限りになる。

scopeで範囲を限定しない場合、ユーザーはすべての記事のうち一つしかブックマークできなくなる。