1

一意性を検証しており、特定の値 (0000 など) をスキップしたい:

validates_uniqueness_of :gtin, :scope => [:user_id, :item_id]

私は次の構造を使用しようとしていますが、うまくいきません:

validates_uniqueness_of :gtin, :scope => [:user_id, :item_id], :unless => Proc.new{|base_item| base_item.gtin == '0000'}

特定の値をスキップするにはどうすればよいですか? ありがとう。

PSアップデート!!!動作を変更する手動移行は見られませんでした

4

3 に答える 3

0

これが落とし穴かどうかはわかりません。gtin の値は文字列ですか、それとも整数ですか? あなたのやっていることはうまくいくように見えますが、それが整数の場合は次のように変更したいと思うでしょう:

validates :gtin, :uniqueness => {:scope => [:user_id, :item_id]}, :unless => Proc.new{|base_item| base_item.gtin == 0000}
于 2011-09-21T07:38:09.020 に答える
0

私は同じことをしようとしています、そして私は何が悪いのか知っていると思います。問題は、「base_item」オブジェクトが一意性をチェックしている値を参照しており、一致する可能性のあるオブジェクトを参照していない場合です。

検証しているアイテムをチェックするつもりかもしれませんが (この場合、私は間違ったツリーを吠えています)、特定の一致を除外したいという一意性のケースではより自然に思えます。たとえば、is_deleted フィールドがあり、一致するオブジェクトが削除された場合に一意性違反を許可したいとします。

プロシージャで見つかった一致するオブジェクトを参照する方法が見つかりません。ただし、独自のカスタム検証関数を作成することでこれを実現できます。たとえば、'name' の一意性を検証する場合は、次のようにします。

validate :full_validation
def full_validation
  matches = self.class.find_all_by_name(self.name).select {|match| match.id != self.id && match.is_deleted==false}
  return (matches.size>0)
end
于 2012-07-23T21:27:48.853 に答える
0

オプションを使用する:unlessことは確かに正しい方法ですが、オブジェクト全体を proc 引数として取得すると思うので、そうする必要があります

validates_uniqueness_of :gtin, :scope => [:user_id, :item_id], :unless => Proc.new{|obj| obj.gtin == '0000'}
于 2011-09-21T07:04:48.800 に答える