¿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.
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
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.
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
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
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
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