1

我有独特的验证,我想跳过某些值或值(例如0000):跳过validation_uniqueness某些价值

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'} 

如何跳过某些值或值? 谢谢。

P.S.更新! 没有看到一个手动迁移,使用:unless选项肯定是正确的方式,也改变人们的行为

回答

0

,但我认为你得到整个对象作为参数proc所以它应该是

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

好的,我也是用这种方式,但它不起作用。也许我需要干净的分贝之前使用? –

0

如果没有把握这是一个难题。 gtin是一个字符串还是一个整数的值?它看起来像你这样做应该工作的,但如果它是一个整数,你想改变为:

validates :gtin, :uniqueness => {:scope => [:user_id, :item_id]}, :unless => Proc.new{|base_item| base_item.gtin == 0000} 
+0

不是,它是字符串 –

0

我试图做同样的事情,我想我知道什么是错。问题是,if或除非“base_item”对象引用您正在检查唯一性的值,而不是预期的匹配对象。

也许你确实的意思是检查你正在验证的项目(在这种情况下,我在咆哮错误的树),但在独特性的情况下,想排除某些匹配似乎更自然。例如,我有一个字段is_deleted,并且如果匹配对象已被删除,我想允许违反唯一性。

我找不到任何方法来引用在proc中找到的匹配对象。尽管如此,您可以通过自定义验证功能来完成此任务。例如,如果你想验证'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