如何从 Rails 中的枚举中获取整数值?

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

我的模型中有一个枚举,与数据库中的列相对应。

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。

ruby-on-rails ruby-on-rails-4
7个回答
166
投票

您可以从枚举所在的类获取枚举的整数值:

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
    

159
投票
你可以像这样得到整数:

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。


66
投票
导轨

< 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
    

6
投票
我的简短回答是

Model.sale_infos[:plan_2]

 如果您想获得 
plan_2
 的价值
    


6
投票
我在模型中编写了一个方法,以在 Rails 5.1 应用程序中实现相同的效果。

根据您的情况,将其添加到您的模型中并在需要时在对象上调用它

def numeric_sale_info self.class.sale_infos[sale_info] end
    

0
投票
这里的大多数解决方案都要求您手头有一个记录或模型类。这是一种方法,您可以使用 Hash 的

.key

 方法从枚举中获取整数值,而无需创建记录:

sale_info.key('plan_3') => 3
如果您正在执行一些 ETL 并在依赖于不同场景中的数字整数值和/或字符串值的系统之间将原始值映射到字符串值或从字符串值映射原始值,则这特别有用。

请注意,这可能不是高性能,因为在散列中搜索值(而不是键)效率不高。如果您每秒处理数百万个值或有一个包含(恶心)数百个值的枚举,您可能需要构建一个新的哈希来反转枚举的值和键,以便您可以在相反的方向上进行有效的查找。


0
投票
所以......它没有记录(据我所知),因此我找不到它何时开始工作或为什么开始工作的参考,但

Model.sale_info_value

会给你你正在寻找的东西。 

枚举定义似乎正在创建一个

<enum name>_value

方法。由于这没有记录,而且我无法找到它的来源(我使用控制台上列出的交互式方法发现了它),所以我会相当小心地使用它。

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