【问题标题】:How to use an enum value in an :if validation如何在 :if 验证中使用枚举值
【发布时间】:2018-05-29 01:48:00
【问题描述】:

假设我们有一个枚举

enum status: { pending: 0, finished: 1, extended: 2 }

我们要根据枚举状态的值创建一个验证

validates_presence_of :explanation, if: ...enum status is equal to "extended"

我一直很暴力,尝试了很多组合,但似乎找不到任何有效的方法。

【问题讨论】:

    标签: ruby-on-rails enums ruby-on-rails-5


    【解决方案1】:

    您可以使用pending? 评估您的领域

    class Job < ActiveRecord::Base
      enum status: [ :active, :archived ]
      validates_presence_of :explanation, if: Proc.new { |a| a.extended? }
    end
    

    完整示例:

    class Conversation < ActiveRecord::Base
      enum status: [ :active, :archived ]
    end
    
    # conversation.update! status: 0
    conversation.active!
    conversation.active? # => true
    conversation.status  # => "active"
    
    # conversation.update! status: 1
    conversation.archived!
    conversation.archived? # => true
    conversation.status    # => "archived"
    
    # conversation.status = 1
    conversation.status = "archived"
    
    conversation.status = nil
    conversation.status.nil? # => true
    conversation.status      # => nil
    

    参考:
    http://api.rubyonrails.org/classes/ActiveRecord/Enum.html

    【讨论】:

      【解决方案2】:

      短版:

      validates_presence_of :explanation, if: 'extended?'
      

      【讨论】:

      • 不错!这也适用于符号:if: :extended?
      猜你喜欢
      • 2017-07-03
      • 2010-09-06
      • 2023-02-10
      • 2019-06-05
      • 2020-12-05
      • 2018-10-13
      • 1970-01-01
      • 1970-01-01
      • 2017-12-14
      相关资源
      最近更新 更多