我的模型中有一个枚举,与数据库中的列相对应。
enum
看起来像:
enum sale_info: { plan_1: 1, plan_2: 2, plan_3: 3, plan_4: 4, plan_5: 5 }
如何获取整数值?
我已经尝试过
Model.sale_info.to_i
但是这只返回0。
您可以从枚举所在的类获取枚举的整数值:
Model.sale_infos # Pluralized version of the enum attribute name
返回一个哈希值,例如:
{ "plan_1" => 1, "plan_2" => 2 ... }
然后,您可以使用
Model
类实例中的 sale_info 值来访问该实例的整数值:
my_model = Model.find(123)
Model.sale_infos[my_model.sale_info] # Returns the integer value
my_model = Model.find(123)
my_model[:sale_info] # Returns the integer value
rails 5 更新
对于 Rails 5,上述方法现在返回字符串值:(目前我能看到的最好的方法是:
my_model.sale_info_before_type_cast
Shadwell 的答案也继续适用于 Rails 5。
read_attribute()
:
model = Model.find(123)
model.read_attribute('sale_info')
导轨 >= 5
read_attribute_before_type_cast
model.read_attribute_before_type_cast(:sale_info)
=> 1
Model.sale_infos[:plan_2]
如果您想获得
plan_2
的价值
根据您的情况,将其添加到您的模型中并在需要时在对象上调用它
def numeric_sale_info
self.class.sale_infos[sale_info]
end
.key
方法从枚举中获取整数值,而无需创建记录:
sale_info.key('plan_3')
=> 3
如果您正在执行一些 ETL 并在依赖于不同场景中的数字整数值和/或字符串值的系统之间将原始值映射到字符串值或从字符串值映射原始值,则这特别有用。请注意,这可能不是高性能,因为在散列中搜索值(而不是键)效率不高。如果您每秒处理数百万个值或有一个包含(恶心)数百个值的枚举,您可能需要构建一个新的哈希来反转枚举的值和键,以便您可以在相反的方向上进行有效的查找。
Model.sale_info_value
会给你你正在寻找的东西。枚举定义似乎正在创建一个
<enum name>_value
方法。由于这没有记录,而且我无法找到它的来源(我使用控制台上列出的交互式方法发现了它),所以我会相当小心地使用它。