¿Cómo obtener un valor entero de una enumeración en Rails?


Tengo una enumeración en mi Modelo que corresponde a la columna en la base de datos.

El enum se parece a:

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

¿Cómo puedo obtener el valor entero?

He intentado

Model.sale_info.to_i

Pero esto solo devuelve 0.

Author: Cleyton, 2014-08-29

5 answers

Puede obtener los valores enteros para una enumeración de la clase en la que se encuentra la enumeración:

Model.sale_infos # Pluralized version of the enum attribute name

Que devuelve un hash como:

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

Luego puede usar el valor sale_info de una instancia de la clase Model para acceder al valor entero para esa instancia :

my_model = Model.find(123)
Model.sale_infos[my_model.sale_info] # Returns the integer value
 106
Author: Shadwell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-29 14:34:26

Puedes obtener el entero así:

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

Actualización para rails 5

Para rails 5 el método anterior ahora devuelve el valor de cadena: (

El mejor método que puedo ver por ahora es:

my_model.sale_info_before_type_cast

La respuesta de Shadwell también sigue funcionando para rails 5.

 107
Author: Subtletree,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-07 00:09:06

Carriles

Otra forma sería usar read_attribute():

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

Rails > = 5

Puedes usar read_attribute_before_type_cast

model.read_attribute_before_type_cast(:sale_info)
=> 1
 20
Author: ArashM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-01 06:38:13

Mi respuesta corta es Model.sale_infos[:plan_2] en caso de que desee obtener el valor de plan_2

 0
Author: Brilliant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-21 08:37:02

Escribí un método en mi Modelo para lograr lo mismo en mi aplicación Rails 5.1.

Para su caso, agregue esto a su Modelo y llámelo al objeto cuando sea necesario

def numeric_sale_info
  self.class.sale_infos[sale_info]
end
 0
Author: shrmn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-27 15:21:50