121
votes

I have a enum in my Model that corresponds to column in the database.

The enum looks like:

  enum sale_info: { plan_1: 1, plan_2: 2, plan_3: 3, plan_4: 4, plan_5: 5 }

How can I get the integer value?

I've tried

Model.sale_info.to_i

But this only returns 0.

5
Shouldnt it be Model.sale_info.value.to_i? e.g. Model.sale_info.plan_1.to_i - Florian Gl
Nops... Because I don't know which plan its store at database. So I want to recover it and cast it as an integer - Cleyton

5 Answers

161
votes

You can get the integer values for an enum from the class the enum is on:

Model.sale_infos # Pluralized version of the enum attribute name

That returns a hash like:

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

You can then use the sale_info value from an instance of the Model class to access the integer value for that instance:

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

You can get the integer like so:

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

Update for rails 5

For rails 5 the above method now returns the string value :(

The best method I can see for now is:

my_model.sale_info_before_type_cast

Shadwell's answer also continues to work for rails 5.

57
votes

Rails < 5

Another way would be to use read_attribute():

model = Model.find(123)
model.read_attribute('sale_info')

Rails >= 5

You can use read_attribute_before_type_cast

model.read_attribute_before_type_cast(:sale_info)
=> 1
5
votes

My short answer is Model.sale_infos[:plan_2] in case if you want to get value of plan_2

5
votes

I wrote a method in my Model to achieve the same in my Rails 5.1 app.

Catering for your case, add this into your Model and call it on the object when needed

def numeric_sale_info
  self.class.sale_infos[sale_info]
end