Rails 如何处理方法名称不友好的枚举值?

Are*_*epo 2 ruby ruby-on-rails

我有一个 (Rails) 类,它具有以下枚举值:

class DeploymentRequest
  enum frequency: ['One-off', 'Monthly', 'Quarterly', 'Annual']
  #...
end
Run Code Online (Sandbox Code Playgroud)

根据文档(尽管有点令我惊讶,区分大小写),DeploymentRequest 具有诸如#Monthly?#Monthly!等实例方法#Quarterly?(以及类方法.Monthly)。但“一次性”的价值是扔掉它和/或我。我试过了

dr.One_off?
dr.Oneoff?
dr.oneoff? # (one lives in hope)
Run Code Online (Sandbox Code Playgroud)

但没有一个有效(并且 Pry/IRB 没有提出任何有用的替代方案)。这里发生了什么事?Rails 是否只是没有定义任何这样的方法集,或者它是否为它们命名了我没有找到的名称?

Yul*_*ule 5

Rails 将这些枚举转换为符号。通过查看模型和 ActiveRecord::Base 之间实例方法的差异,您将能够看到其中一些方法(假设您正在使用该方法):

DeploymentRequest.instance_methods - ActiveRecord::Base.instance_methods
> [:Quarterly?, :Quarterly!, :Annual?, :Annual!, :"One-off?", :"One-off!", :Monthly?, :Monthly!, ....
Run Code Online (Sandbox Code Playgroud)

可以看到,你需要的方法是“:One-off?”,这个方法很难调用。但你可以使用发送:

dr.send(:"One-off?")
Run Code Online (Sandbox Code Playgroud)

丑陋,但不改变枚举值可能是你唯一的选择。