【问题标题】:skip validation_uniqueness for certain values跳过某些值的validation_uniqueness
【发布时间】:2011-09-21 07:01:49
【问题描述】:

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

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

附:更新!!! 没有看到改变行为的手动迁移

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 好的,我也在用这种方式,但是不行。也许我在使用前需要干净的数据库?
    【解决方案2】:

    不确定这是否是一个陷阱。 gtin 的值是字符串还是整数?看起来你应该做什么,但如果它是一个整数,你会想要更改为:

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

    【讨论】:

      【解决方案3】:

      我正在尝试做同样的事情,我想我知道出了什么问题。问题是,如果或除非“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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-25
        • 2020-12-08
        • 2017-07-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多