【问题标题】:How to integrate enum on existing attributes rails如何在现有的属性轨上集成枚举
【发布时间】:2019-11-20 09:49:08
【问题描述】:

我想在现有日期使用enum。 表中有列status,包含数千条记录。

问题是我的数据库中的记录是大写的,例如 ActivePendingAwaiting ReviewClosed等等

现在我定义一个枚举

enum status: [:active,:closed,:pending,:awaiting_review]

由于资本原因和下划线而不是空格,它如何不起作用。

当我执行Model.first.status 时,它返回 nil

【问题讨论】:

  • 嗨 @haseeb Ahmad 你遇到了什么错误?
  • 请参阅“How to Ask”以及链接页面和“mcve”。我们希望看到演示您遇到的问题所需的最少代码。目前我们无法想象代码、数据库或您尝试过的内容,因此您必须帮助我们帮助您。
  • @karthicknagarajan 我更新了问题

标签: ruby-on-rails ruby enums ruby-on-rails-5 enumeration


【解决方案1】:

您的问题是,您正在尝试这样做Model.status,它不会返回任何内容,因为status 是实例方法,而不是类方法,如果您想查看所有状态,请执行此操作

Model.statuses

它返回一个哈希,如果你想获取模型对象的状态,这里是一个例子

Model.first.status

而且,默认情况下,枚举需要一个整数列,所以如果你像这样定义枚举

enum status: [:active,:closed,:pending,:awaiting_review]

那么,表中的值将分别为0, 1, 2, 3

因此您可能希望将status 列迁移到integer,然后编写一个rake 任务来根据枚举值将现有值更新为新值!

在您的情况下,您说 awaiting_review 返回 nil,因为您的现有值为 awaiting review,即没有下划线。为了快速修复,请在您的模型中定义此方法

def status
  if self.read_attribute_before_type_cast(:status) == 'Awaiting Review'
    'Awaiting Review'
  else
    super
  end
end

要对每种情况使用上述方法,请改为这样定义您的枚举

enum status: { active: 'active', closed: 'closed', pending: 'pending', awaiting_review: 'Awaiting Review' }

根据表中保存的内容更改字符串哈希值

希望有帮助

【讨论】:

  • Model.first.status 也返回 nil
  • 它在数据库中有等待审核,但是当我执行 Model.first.status 时它返回 nil
  • @HaseebAhmad 刚刚更新了我的答案,如果您有任何其他疑问或问题,请告诉我
  • 谢谢....但在其他人也没有大写问题...我该如何解决这个问题?
  • @HaseebAhmad 刚刚更新了我的答案,只需使用最后一种方法,它应该可以工作,只需将哈希字符串值更新为表中每个状态的值!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
相关资源
最近更新 更多