Release
列とmedium
列(他の中でも)を持つcountry
モデルがあります。同一のreleases
/medium
の組み合わせを共有するcountry
があってはなりません。
これをRails検証としてどのように記述しますか?
scope
オプションで niqueness 検証を使用できます。
また、書き込み前に同時にチェックされたときに新しいレコードが検証に合格しないように、DBに一意のインデックスを追加する必要があります。
class AddUniqueIndexToReleases < ActiveRecord::Migration
def change
add_index :releases, [:country, :medium], unique: true
end
end
class Release < ActiveRecord::Base
validates :country, uniqueness: { scope: :medium }
end
上記のすべての答えには、モデル内の複数の属性の一意性を検証する方法がありません。以下のコードは、スコープ内で複数の属性を使用する方法を示します。
validates :country, uniqueness: { scope: [:medium, :another_medium] }
country
およびanother_medium
の値を持つすべての行のmedium
の一意性を検証します。
注:上記の列にインデックスを追加することを忘れないでください。これにより、高速検索が保証され、一意のレコードのDBレベル検証が追加されます。
次のように、:scope
パラメーターをバリデーターに渡すことができます。
validates_uniqueness_of :medium, scope: :country
他の例については、 documentation をご覧ください。