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

Cle*_*ton 98 ruby-on-rails ruby-on-rails-4

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

enum样子:

  enum sale_info: { plan_1: 1, plan_2: 2, plan_3: 3, plan_4: 4, plan_5: 5 }
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到整数值?

我试过了

Model.sale_info.to_i
Run Code Online (Sandbox Code Playgroud)

但这只返回0.

Sha*_*ell 129

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

Model.sale_infos # Pluralized version of the enum attribute name
Run Code Online (Sandbox Code Playgroud)

返回一个哈希,如:

{ "plan_1" => 1, "plan_2" => 2 ... }
Run Code Online (Sandbox Code Playgroud)

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

my_model = Model.find(123)
Model.sale_infos[my_model.sale_info] # Returns the integer value
Run Code Online (Sandbox Code Playgroud)


Sub*_*ree 129

你可以像这样得到整数:

my_model = Model.find(123)
my_model[:sale_info] # Returns the integer value
Run Code Online (Sandbox Code Playgroud)

rails 5的更新

对于rails 5,上面的方法现在返回字符串值:(

我现在能看到的最好的方法是:

my_model.sale_info_before_type_cast
Run Code Online (Sandbox Code Playgroud)

Shadwell的答案也继续适用于rails 5.

  • 请注意,如果尚未保存模型,则此方法不起作用.如果为my_model.sale_info分配了一个没有后续保存的字符串,则sale_info_before_type_cast值(和my_model [:sale_info])仍然是一个字符串. (4认同)
  • 这似乎在Rails 5中不再起作用了. (2认同)

Ara*_*shM 33

Rails <5

另一种方法是使用read_attribute():

model = Model.find(123)
model.read_attribute('sale_info')
Run Code Online (Sandbox Code Playgroud)

Rails> = 5

您可以使用 read_attribute_before_type_cast

model.read_attribute_before_type_cast(:sale_info)
=> 1
Run Code Online (Sandbox Code Playgroud)

  • 在Rails 5中不起作用;它返回字符串。 (2认同)

小智 6

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


shr*_*rmn 6

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

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

def numeric_sale_info
  self.class.sale_infos[sale_info]
end
Run Code Online (Sandbox Code Playgroud)