我有 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?
就不起作用了。
在 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 中的枚举:最佳实践和用例。升级对于改进管理枚举等复杂数据结构的方式特别有帮助,使您的代码库更干净且更易于维护。