web-dev-qa-db-ja.com

Rails:2つの列の一意性を検証します(一緒に)

Release列とmedium列(他の中でも)を持つcountryモデルがあります。同一のreleases/mediumの組み合わせを共有するcountryがあってはなりません。

これをRails検証としてどのように記述しますか?

95

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
166
tompave

上記のすべての答えには、モデル内の複数の属性の一意性を検証する方法がありません。以下のコードは、スコープ内で複数の属性を使用する方法を示します。

validates :country, uniqueness: { scope: [:medium, :another_medium] }

countryおよびanother_mediumの値を持つすべての行のmediumの一意性を検証します。

注:上記の列にインデックスを追加することを忘れないでください。これにより、高速検索が保証され、一意のレコードのDBレベル検証が追加されます。

46
Aamir

次のように、:scopeパラメーターをバリデーターに渡すことができます。

validates_uniqueness_of :medium, scope: :country

他の例については、 documentation をご覧ください。

30