如何判断ActiveRecord::Enum是用哈希还是数组初始化的?
获取Rails枚举的原始声明形式(哈希/数组)
在Rails里,直接通过Project.stages或Project.statuses只能拿到处理后的标准化哈希,确实没法直接判断当初是用哈希还是数组声明的。不过可以通过Active Record内部存储的枚举定义来获取原始的声明内容:
Rails会把每个枚举的原始配置存在模型的_enum_definitions属性里,这是一个哈希,键是枚举名称,值里包含了当初定义时用的原始数据。
具体用法
- 查看模型所有枚举的原始定义:
Project._enum_definitions
执行后会返回类似这样的结构:
{ stage: { name: :stage, values: {Idea: "idea", Done: "done", "On hold": "on hold", Cancelled: "cancelled"}, default: nil, scopes: true, # 其他内部属性... }, status: { name: :status, values: [:draft, :published, :archived], default: nil, scopes: true, # 其他内部属性... } }
- 获取单个枚举的原始声明:
- 拿到
stage枚举的原始哈希:
Project._enum_definitions[:stage][:values] # 返回结果:{Idea: "idea", Done: "done", "On hold": "on hold", Cancelled: "cancelled"}
- 拿到
status枚举的原始数组:
Project._enum_definitions[:status][:values] # 返回结果:[:draft, :published, :archived]
这个_enum_definitions是Active Record内部维护的结构,从Rails 5到最新的7.x版本都稳定可用,能直接获取到你当初定义枚举时用的原始哈希或数组。
内容的提问来源于stack exchange,提问作者Paul Bob
相关产品推荐
相关产品推荐

