我有唯一性验证,我想跳过某些值或值(例如0000):
validates_uniqueness_of :gtin, :scope => [:user_id, :item_id]
我试着用next结构,但她不工作:
validates_uniqueness_of :gtin, :scope => [:user_id, :item_id], :unless => Proc.new{|base_item| base_item.gtin == '0000'}
如何跳过某些值?谢谢。
注:更新! !没有看到手动迁移,这会改变行为
使用:unless
选项当然是正确的方式,但我认为你得到整个对象作为进程参数,所以它应该是
validates_uniqueness_of :gtin, :scope => [:user_id, :item_id], :unless => Proc.new{|obj| obj.gtin == '0000'}
不确定这是不是一个陷阱。gtin的值是字符串还是整数?看起来你应该这样做,但如果它是一个整数,你会想要改变为:
validates :gtin, :uniqueness => {:scope => [:user_id, :item_id]}, :unless => Proc.new{|base_item| base_item.gtin == 0000}
我正试图做同样的事情,我想我知道什么是错的。问题是,if或unless"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