跳过某些值的validation_uniqueness

时间:2011-09-21 07:01:49

标签: ruby-on-rails ruby-on-rails-3 validation validates-uniqueness-of

我对唯一性进行了验证,我想跳过某些值或值(例如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'}

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

P.S。更新! 没有看到手动迁移,这改变了行为

3 个答案:

答案 0 :(得分:0)

使用:unless选项肯定是正确的方法,但我认为你将整个对象作为proc参数,所以它应该是

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

答案 1 :(得分:0)

不确定这是否有问题。 gtin的值是字符串还是整数?它看起来像你应该做的工作,但如果它是一个整数你想要改为:

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

答案 2 :(得分:0)

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

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

我找不到任何方法来引用在proc中找到的匹配对象。您可以通过自己创建自定义验证功能来实现此目的。例如,如果要验证“名称”的唯一性,可以尝试这样的事情:

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