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


105

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

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_info.value.to_i吗?例如Model.sale_info.plan_1.to_i
Florian Gl 2014年

Nops ...因为我不知道它在数据库中计划哪个存储。因此,我想将其恢复为integer
Cleyton,2014年

Answers:


140

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

Model.sale_infos # Pluralized version of the enum attribute name

返回的哈希像:

{ "plan_1" => 1, "plan_2" => 2 ... }

然后,您可以使用该类实例中的sale_info值Model来访问该实例的整数值:

my_model = Model.find(123)
Model.sale_infos[my_model.sale_info] # Returns the integer value

138

您可以这样获得整数:

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。


1
这是因为“枚举”将为您的模型创建方法sale_info,请使用[:sale_info]获取属性值,而不是从sale_info方法返回。
etlds

6
请注意,如果尚未保存模型,则此方法无效。如果已为my_model.sale_info分配了字符串但未进行后续保存,则sale_info_before_type_cast值(和my_model [:sale_info])仍为字符串。
蒂姆·史密斯

42

滑轨<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

1
@GrantBirchmeier更新了答案。您可以使用read_attribute_before_type_cast
ArashM

在Rails 5之前,model.read_attribute('sale_info')等于model [:sale_info]
zw963

1

我的简短回答是Model.sale_infos[:plan_2],如果您想获得价值plan_2


1

我在模型中编写了一种方法,以在Rails 5.1应用程序中实现相同的方法。

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

def numeric_sale_info
  self.class.sale_infos[sale_info]
end
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.