如何在 :if 验证中使用枚举值

Tim*_*ss 5 enums ruby-on-rails ruby-on-rails-5

假设我们有一个枚举

enum status: { pending: 0, finished: 1, extended: 2 }
Run Code Online (Sandbox Code Playgroud)

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

validates_presence_of :explanation, if: ...enum status is equal to "extended"
Run Code Online (Sandbox Code Playgroud)

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

Shi*_*iko 2

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

class Job < ActiveRecord::Base
  enum status: [ :active, :archived ]
  validates_presence_of :explanation, if: Proc.new { |a| a.extended? }
end
Run Code Online (Sandbox Code Playgroud)

完整示例:

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
Run Code Online (Sandbox Code Playgroud)

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