Comment obtenir une valeur entière à partir d'une énumération dans Rails?

J'ai une énumération dans mon modèle qui correspond à la colonne dans la base de données.

Le enum ressemble:

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

Comment puis-je obtenir la valeur entière?

J'ai essayé

Model.sale_info.to_i

Mais cela ne renvoie que 0.

79
demandé sur Cleyton 2014-08-29 18:17:52

5 réponses

Vous pouvez obtenir les valeurs entières pour une énumération à partir de la classe sur laquelle se trouve l'énumération:

Model.sale_infos # Pluralized version of the enum attribute name

Qui renvoie un hachage comme:

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

Vous pouvez ensuite utiliser la valeur sale_info d'une instance de la classe Model pour accéder à la valeur entière de cette instance :

my_model = Model.find(123)
Model.sale_infos[my_model.sale_info] # Returns the integer value
106
répondu Shadwell 2014-08-29 14:34:26

Vous pouvez obtenir l'entier comme ceci:

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

Mise à Jour pour les rails 5

Pour rails 5, la méthode ci-dessus renvoie maintenant la valeur de chaîne: (

La meilleure méthode que je peux voir pour l'instant est:

my_model.sale_info_before_type_cast

La réponse de Shadwell continue également de fonctionner pour rails 5.

107
répondu Subtletree 2016-10-07 00:09:06

Rails

Un Autre moyen serait d'utiliser read_attribute():

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

Rails > = 5

, Vous pouvez utiliser read_attribute_before_type_cast

model.read_attribute_before_type_cast(:sale_info)
=> 1
20
répondu ArashM 2017-08-01 06:38:13

Ma réponse courte est Model.sale_infos[:plan_2] dans le cas où si vous souhaitez obtenir la valeur de plan_2

0
répondu Brilliant 2017-11-21 08:37:02

J'ai écrit une méthode dans mon modèle pour obtenir la même chose dans mon application Rails 5.1.

Pour votre cas, ajoutez ceci dans votre modèle et appelez-le sur l'objet si nécessaire

def numeric_sale_info
  self.class.sale_infos[sale_info]
end
0
répondu shrmn 2018-01-27 15:21:50