Ruby on rails 如何在现有属性rails上集成enum

Ruby on rails 如何在现有属性rails上集成enum,ruby-on-rails,ruby,enums,ruby-on-rails-5,enumeration,Ruby On Rails,Ruby,Enums,Ruby On Rails 5,Enumeration,我想在现有日期使用枚举。 包含数千条记录的表中有列状态 问题是我的数据库中的记录是大写的,如活动、待定、等待审核、关闭等 现在我定义一个枚举 enum status: [:active,:closed,:pending,:awaiting_review] 由于资本原因和下划线而不是空间,它如何不起作用 当我执行Model.first.status时,它返回nil您的问题是,您正在尝试执行此Model.status,它不会返回任何内容,因为status是一个实例方法,而不是类方法,如果您想查看所

我想在现有日期使用枚举。 包含数千条记录的表中有列状态

问题是我的数据库中的记录是大写的,如活动、待定、等待审核、关闭等

现在我定义一个枚举

enum status: [:active,:closed,:pending,:awaiting_review]
由于资本原因和下划线而不是空间,它如何不起作用


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

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

Model.statuses
它返回一个散列,如果您想获取模型对象的状态,下面是一个示例

Model.first.status
默认情况下,enum需要一个整数列,所以如果您这样定义enum

enum status: [:active,:closed,:pending,:awaiting_review]
然后,表中的值分别为0、1、2和3

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

在您的例子中,您说waiting_review返回nil,因为您的现有值正在等待审核,即没有下划线。要快速修复,请在模型中定义此方法

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' }
根据表中保存的内容更改字符串哈希值


希望对您有所帮助

Hi@haseeb Ahmad您有什么错误?请参阅和链接的页面和。我们希望看到演示问题所需的最少代码。目前,我们无法想象代码、数据库或您尝试过的内容,因此您必须帮助我们帮助您。@karthicknagarajan我更新了questionModel.first.status也返回nilIt在数据库中等待审阅,但当我执行Model.first.status时返回nil@HaseebAhmad刚刚更新了我的答案,如果您有任何其他疑问或问题,请告诉我。谢谢。。。。但在其他情况下,也可以使用nil来大写这个问题……我如何解决这个问题?@HaseebAhmad刚刚更新了我的答案,只需使用最后一种方法就可以了,只需将哈希字符串值更新到表中每个状态的值即可!