【问题标题】:Validation issue using multiple Proc objects使用多个 Proc 对象的验证问题
【发布时间】:2016-10-13 12:40:31
【问题描述】:

我已通过 Proc 进行验证,但存在问题

validates :subcategory, presence: true, 
if: Proc.new {|product| product.detail.blank?} && Proc.new { |product|  product.category.id != 16 }

我的问题是当我在第二个过程中有 true 时,我的验证会触发。

为什么会这样?它不应该因为false && true=>false而返回false吗?

【问题讨论】:

    标签: ruby-on-rails ruby proc


    【解决方案1】:

    我认为你最好使用单个 proc 对象:

    validates :subcategory,
      presence: true,
      if: Proc.new { |product| product.detail.blank? && product.category.id != 16 }
    

    【讨论】:

    • 不会product.category_id更好,如果没有类别就不会爆炸,也不需要从数据库中加载类别。
    • @j-dexx 确实如此,我只是不想这么多地修改 OP 的代码 :)
    【解决方案2】:

    其他人评论了实现您想要的更好的方法。我只是指出你的误解。

    它应该返回false,因为false && true => false

    不。实际上,它是Proc && Proc => Proc (proc1 && proc2 => proc2)。因此,由于 && 运算符的工作方式(这发生在类加载时),您的第一个 proc 将被忽略,并且永远不会被调用,甚至一次也不会。

    【讨论】:

    • 这将是问题的真正答案
    • @sergio-tulentsev 你能解释一下它是如何在class loading time被忽略的吗?
    • @Dinesh:在加载具有该类的文件时评估该表达式 (Proc && Proc)。因为它是validates 调用的一部分,这是一个类级别的表达式。是的,这意味着 validates 也不会再被调用(因为类已经加载)(我在这里忽略了 rails 的开发模式类重新加载无关)。
    【解决方案3】:

    我会推荐使用 :if 中的方法。

    validates :subcategory, presence: true, if: :my_cond?
    
    def my_cond?
      detail.blank? && category.id != 16
    end 
    

    它使您的代码更清晰。如果您为方法 my_cond? 找到了一个非常好的名称,那么您的代码将更具可读性。

    【讨论】:

    • @AndreyDeineko 是的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 2017-06-24
    相关资源
    最近更新 更多