【问题标题】:Rails 5 - using enums, what to do when the enum value is a reserved word?Rails 5 - 使用枚举,当枚举值是保留字时该怎么办?
【发布时间】:2016-09-08 18:13:24
【问题描述】:

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

enum direction_type: [:undefined, :loop, :out_and_back, :point_to_point]

这可行,但在日志中我看到了这个错误:

Creating scope :loop. Overwriting existing method Trail.loop.

另一个:

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

Creating scope :new. Overwriting existing method Trail.new.

我不完全确定这些错误的含义,但它们听起来不太好!

我应该更改这些枚举还是有其他解决方案(比如我可以添加一些巧妙的范围规则来修复它们?)

【问题讨论】:

    标签: ruby-on-rails enums


    【解决方案1】:

    即使您无法更改枚举值,您仍然应该能够通过枚举前缀或后缀解决冲突。枚举定义中的 _prefix / _postfix 选项应该保持枚举的值不变,但会影响自动生成的布尔和 bang 方法名称以及范围名称

    所以,是这样的:

    enum direction_type: [:undefined, :loop, :out_and_back, :point_to_point], _prefix: true
    

    应生成以下范围:direction_type_undefineddirection_type_loop 等...这不会与现有的类方法发生冲突。

    请参阅docs in the source code 了解更多信息。

    【讨论】:

    • 谢谢我看过那个解决方案并且(愚蠢地)假设它会导致前缀实际上被添加到枚举中,但你是对的,它使枚举的值保持不变。所以我的 15 行代码的解决方案被替换为你的 13 个字符,大声笑。 :)
    • 我忘了我能做到,你的回答很有用
    【解决方案2】:

    如果你不想失去原生功能,你应该改变枚举

    :loop 
    

    :new
    

    【讨论】:

    • 是的,我担心失去本机功能。也许我可以覆盖枚举的 setter 和 getter...
    • @rmcshry:重命名更简单
    • @SergioTulentsev 我也这么认为)
    • 我也是,除了一个问题 - 多个不同的客户端应用程序希望在各自不同的 UI 中显示“循环”和“新”。因此,它们都必须实现相同的逻辑来将值与 API 调用进行转换。而且我必须在 API 文档中记录这一点——为什么不免费给他们他们想要的东西呢?
    • @rmacsharry 为什么不在 API 中将值公开为循环和新值,并在内部使用不同的名称进行处理?
    【解决方案3】:

    遗憾的是,我无法更改枚举值 - 多个不同的客户端使用数据,将枚举值更改为其他值会导致混淆。他们采用“循环”和“新”并直接在 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 1970-01-01
      • 2020-10-19
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      相关资源
      最近更新 更多