Ruby on rails Rails 5-使用枚举,当枚举值是保留字时该怎么办?

Ruby on rails Rails 5-使用枚举,当枚举值是保留字时该怎么办?,ruby-on-rails,enums,Ruby On Rails,Enums,我有一个简单的枚举(添加在Rails4.something中) 这是可行的,但在日志中我看到了以下错误: Creating scope :loop. Overwriting existing method Trail.loop. 另一个: enum status: [:undefined, :new, :draft, :published] Creating scope :new. Overwriting existing method Trail.new. 我不完全确定这些错误是什么意思

我有一个简单的枚举(添加在Rails4.something中)

这是可行的,但在日志中我看到了以下错误:

Creating scope :loop. Overwriting existing method Trail.loop.
另一个:

enum status: [:undefined, :new, :draft, :published]

Creating scope :new. Overwriting existing method Trail.new.
我不完全确定这些错误是什么意思,但它们听起来并不好


我应该更改这些枚举还是有其他解决方案(比如我可以添加一些聪明的作用域规则来修复它们?

如果不想丢失的本机功能,应该更改枚举

:loop 


遗憾的是,更改枚举不是我能做的事情——多个不同的客户端使用数据,将枚举更改为其他值会导致混乱。他们采用“循环”和“新建”并直接在UI中显示这些值

因此,我必须重写模型中的getter/setter,如下所示:

  def distance_type=(distance_type)
    write_attribute(:distance_type, safely_in(distance_type))
  end

  def distance_type
    safely_out(read_attribute(:distance_type))
  end

  private

  def safely_out(distance_type)
    return "loop" if distance_type == "looped"
    distance_type
  end

  def safely_in(distance_type)
    return "looped" if distance_type == "loop"
    distance_type
  end
enum direction_type: [:undefined, :loop, :out_and_back, :point_to_point], _prefix: true

即使无法更改枚举值,也应该能够解决与枚举前缀或后缀ing的冲突。枚举定义中的
\u前缀
/
\u后缀
选项应保持枚举的值不变,但会影响自动生成的布尔和bang方法名称以及作用域名称

比如说:

  def distance_type=(distance_type)
    write_attribute(:distance_type, safely_in(distance_type))
  end

  def distance_type
    safely_out(read_attribute(:distance_type))
  end

  private

  def safely_out(distance_type)
    return "loop" if distance_type == "looped"
    distance_type
  end

  def safely_in(distance_type)
    return "looped" if distance_type == "loop"
    distance_type
  end
enum direction_type: [:undefined, :loop, :out_and_back, :point_to_point], _prefix: true
应生成以下范围:
方向类型未定义
方向类型循环
,等等。。。这将不会与现有类方法发生冲突


有关更多信息,请参阅。

是的,我担心失去本机功能。也许我可以覆盖枚举的setter和getter…@rmcsharry:重命名是simpler@SergioTulentsev我也这么认为),除了一个问题——多个不同的客户端应用程序希望在各自不同的UI中显示“循环”和“新”。因此,它们都必须实现相同的逻辑,以便在API调用之间转换值。我必须在API文档中记录这一点-为什么不免费为他们提供他们想要的?@rmacsharry为什么不在API中以循环和新的形式公开这些值,并在内部使用不同的名称进行处理?感谢我查看了该解决方案,并且(愚蠢地)假设它将导致前缀实际添加到枚举中,但是你是对的,它保持枚举的值不变。所以我的15行代码的解决方案被你的13个字符的解决方案所取代,哈哈:)我忘了我能做到,你的答案非常有用