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

105

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

El enumparece:

  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.

Cleyton
fuente
¿No debería serlo Model.sale_info.value.to_i? Por ejemploModel.sale_info.plan_1.to_i
Florian Gl
Nops ... Porque no sé qué plan tiene su tienda en la base de datos. Así que quiero recuperarlo y lanzarlo como uninteger
Cleyton

Respuestas:

140

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

Eso devuelve un hash como:

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

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

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

Puede obtener el número entero así:

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

Actualización para rails 5

Para rieles 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.

Árbol sutil
fuente
1
Es porque 'enum' creará un método sale_info para su modelo, use [: sale_info] para obtener el valor de la propiedad en lugar del retorno del método sale_info.
etlds
6
Tenga en cuenta que este método no funciona si el modelo no se ha guardado. El valor sale_info_before_type_cast (y my_model [: sale_info]) sigue siendo una cadena si a my_model.sale_info se le ha asignado una cadena sin un guardado posterior.
Tim Smith
42

Rieles <5

Otra forma sería usar read_attribute():

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

Rieles> = 5

Puedes usar read_attribute_before_type_cast

model.read_attribute_before_type_cast(:sale_info)
=> 1
ArashM
fuente
1
@GrantBirchmeier Actualizó la respuesta. Puede utilizar read_attribute_before_type_cast.
ArashM
Antes de Rails 5, model.read_attribute ('sale_info') igual al modelo [: sale_info]
zw963
1

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

Brilliant-DucN
fuente
1

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

Catering para su caso, agregue esto a su modelo y llámelo en el objeto cuando sea necesario

def numeric_sale_info
  self.class.sale_infos[sale_info]
end
Shrmn
fuente