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


105

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

Le enumressemble à:

  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.


Cela ne devrait-il pas être le cas Model.sale_info.value.to_i? par exempleModel.sale_info.plan_1.to_i
Florian Gl

Non ... Parce que je ne sais pas quel plan son magasin à la base de données. Je veux donc le récupérer et le lancer comme uninteger
Cleyton

Réponses:


140

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

Model.sale_infos # Pluralized version of the enum attribute name

Cela renvoie un hachage comme:

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

Vous pouvez ensuite utiliser la valeur sale_info d'une instance de la Modelclasse 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

139

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 les 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 les rails 5.


1
C'est parce que 'enum' créera une méthode sale_info pour votre modèle, utilisez [: sale_info] pour obtenir la valeur de la propriété au lieu du retour de la méthode sale_info.
etlds

6
Notez que cette méthode ne fonctionne pas si le modèle n'a pas été enregistré. La valeur sale_info_before_type_cast (et my_model [: sale_info]) est toujours une chaîne si my_model.sale_info a reçu une chaîne sans sauvegarde ultérieure.
Tim Smith

42

Rails <5

Une autre façon 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

1
@GrantBirchmeier a mis à jour la réponse. Vous pouvez utiliser read_attribute_before_type_cast.
ArashM

Avant Rails 5, model.read_attribute ('sale_info') égal au model [: sale_info]
zw963

1

Ma réponse courte est Model.sale_infos[:plan_2]au cas où si vous voulez obtenir de la valeurplan_2


1

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-le à votre modèle et appelez-le sur l'objet en cas de besoin

def numeric_sale_info
  self.class.sale_infos[sale_info]
end
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.