不带下划线的 Rails 枚举

问题描述 投票:0回答:1

我有 Rails 5 应用程序,我在

status
表中的
User
列中使用枚举,如下所示:

class User < ApplicationRecord
  enum status: {
    approved: 'approved',
    in_review: 'in review'
  }
end

当用户具有

in_review
状态时,它会向我显示以下内容:

2.4.5 :029 > User.first.status
 => "in_review"

这让我可以做:

2.4.5 :031 > User.first.in_review?
 => true

有没有办法将

User.first.status
显示为
in review
而不带下划线,并且另外不丢失枚举功能以获得以下结果?

2.4.5 :029 > User.first.status
 => "in review"

2.4.5 :031 > User.first.in_review?
 => true

我知道我可以将模型更改为:

class User < ApplicationRecord
  enum status: {
    approved: 'approved',
    'in_review': 'in review'
  }
end

但是这样

User.first.in_review?
就不起作用了。

ruby-on-rails enums
1个回答
0
投票

在 Rails 中,枚举通过将符号键映射到底层值来工作,Rails 使用这些键来定义像 in_review? 这样的方法。但是,当您尝试设置带有空格的枚举值时(例如,“in review”而不是 in_review),Rails 可能会失去生成像 in_review? 这样的辅助方法的能力。在 Rails 5 中,没有直接的方法可以实现没有下划线的显示格式,同时保留所有枚举辅助方法。

一种解决方法是重写状态属性的 getter 方法,在显示状态时将下划线替换为空格。方法如下:

class User < ApplicationRecord
  enum status: { approved: 'approved', in_review: 'in_review' }

  def status
    super&.tr('_', ' ')
  end
end

这会将数据库中的状态值保留为 in_review,从而允许 User.first.in_review?按预期工作,同时将 User.first.status 显示为“审核中”。

为什么考虑升级到 Rails 7? 如果您正在使用 Rails 5,您可能需要考虑升级到 Rails 7,它改进了对枚举的支持以及许多新功能和最佳实践。 Rails 7 提供了更大的灵活性和更新,可以简化枚举和其他模型属性的处理。有关 Rails 7 枚举中的最佳实践和用例,请查看本指南:Ruby on Rails 7 中的枚举:最佳实践和用例。升级对于改进管理枚举等复杂数据结构的方式特别有帮助,使您的代码库更干净且更易于维护。

© www.soinside.com 2019 - 2024. All rights reserved.