【问题标题】:Enum with plus or - sign doesn't work with ActiveRecord带有加号或 - 号的枚举不适用于 ActiveRecord
【发布时间】:2020-01-12 17:39:57
【问题描述】:

我有以下型号:

class Visitor < ApplicationRecord
  enum timezone: {
    'UTC': 'UTC',
    'UTC-12': 'UTC-12',
    'UTC-11': 'UTC-11',
    'UTC-10': 'UTC-10',
    'UTC-9': 'UTC-9',
    'UTC-8': 'UTC-8',
    'UTC-7': 'UTC-7',
    'UTC-6': 'UTC-6',
    'UTC-5': 'UTC-5',
    'UTC-4': 'UTC-4',
    'UTC-3': 'UTC-3',
    'UTC-2': 'UTC-2',
    'UTC-1': 'UTC-1',
    'UTC+0': 'UTC+0',
    'UTC+1': 'UTC+1',
    'UTC+2': 'UTC+2',
    'UTC+3': 'UTC+3',
    'UTC+4': 'UTC+4',
    'UTC+5': 'UTC+5',
    'UTC+6': 'UTC+6',
    'UTC+7': 'UTC+7',
    'UTC+8': 'UTC+8',
    'UTC+9': 'UTC+9',
    'UTC+10': 'UTC+10',
    'UTC+11': 'UTC+11',
    'UTC+12': 'UTC+12',
    'UTC+13': 'UTC+13',
    'UTC+14': 'UTC+14'
  }, _suffix: true
end

当我尝试使用包含 -+ 的任何时区创建新访问者时,它不起作用:

visitor = Visitor.create(timezone: 'UTC-10')
visitor.errors
=> => #<ActiveModel::Errors:0x0000561b5de92338 @base=#<Visitor id: nil, ipv4: nil, ipv6: nil, timezone: "UTC-1", created_at: nil, updated_at: nil>, @messages={:timezone=>["is an invalid timezone"]}, @details={:timezone=>[{:error=>:inclusion, :value=>"UTC-10"}]}>

如果我发送一个无效的,它会引发一个错误(这是有道理的):

ArgumentError ('UTC-100' is not a valid timezone)

有谁知道-+ 是否不能使用枚举?

谢谢。

【问题讨论】:

  • 你可以去看看 hstore。

标签: ruby-on-rails ruby activerecord


【解决方案1】:

截至 Rails 文档:Declare an enum attribute where the values map to integers in the database

您正在尝试在枚举timezone 中映射字符串,您应该更改为:

class Visitor < ApplicationRecord
  enum timezone: {
    'UTC': 100, # duplicate of 'UTC+0'
    'UTC-12': -12,
    'UTC-11': -11,
    'UTC-10': -10,
    'UTC-9': -9,
    'UTC-8': -8,
    'UTC-7': -7,
    'UTC-6': -6,
    'UTC-5': -5,
    'UTC-4': -4,
    'UTC-3': -3,
    'UTC-2': -2,
    'UTC-1': -1,
    'UTC+0': 0,
    'UTC+1': 1,
    'UTC+2': 2,
    'UTC+3': 3,
    'UTC+4': 4,
    'UTC+5': 5,
    'UTC+6': 6,
    'UTC+7': 7,
    'UTC+8': 8,
    'UTC+9': 9,
    'UTC+10': 10,
    'UTC+11': 11,
    'UTC+12': 12,
    'UTC+13': 13,
    'UTC+14': 14
  }, _suffix: true
end

我建议您删除 UTC 以支持 UTC+0(或相反),因为它们表示相同的时区。

【讨论】:

  • 直到UTC+14 存在。谢谢!
  • 这不是真正的问题......我可以将字符串映射到字符串,特别是如果我实际上是表列中的枚举。问题与符号有关(+-)。
  • 请向我们提供您的数据库架构
  • 您是否按照与此主题类似的步骤操作:stackoverflow.com/questions/32938729/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
相关资源
最近更新 更多