Come ottenere un valore intero da un'enumerazione in Rails?


105

Ho un'enumerazione nel mio modello che corrisponde alla colonna nel database.

Gli enumassomiglia:

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

Come posso ottenere il valore intero?

ho provato

Model.sale_info.to_i

Ma questo restituisce solo 0.


Non dovrebbe essere Model.sale_info.value.to_i? ad esempioModel.sale_info.plan_1.to_i
Florian Gl

Nops ... Perché non so quale sia il piano di archiviazione nel database. Quindi voglio recuperarlo e lanciarlo come uninteger
Cleyton

Risposte:


140

Puoi ottenere i valori interi per un enum dalla classe in cui si trova l'enum:

Model.sale_infos # Pluralized version of the enum attribute name

Ciò restituisce un hash come:

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

È quindi possibile utilizzare il valore sale_info da un'istanza della Modelclasse per accedere al valore intero per quell'istanza :

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

139

Puoi ottenere il numero intero in questo modo:

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

Aggiornamento per binari 5

Per rails 5 il metodo sopra ora restituisce il valore stringa :(

Il metodo migliore che posso vedere per ora è:

my_model.sale_info_before_type_cast

La risposta di Shadwell continua a funzionare anche per i binari 5.


1
È perché 'enum' creerà un metodo sale_info per il tuo modello, usa [: sale_info] per ottenere il valore della proprietà invece del ritorno dal metodo sale_info.
Etlds

6
Notare che questo metodo non funziona se il modello non è stato salvato. Il valore sale_info_before_type_cast (e my_model [: sale_info]) è ancora una stringa se a my_model.sale_info è stata assegnata una stringa senza un successivo salvataggio.
Tim Smith

42

Rotaie <5

Un altro modo sarebbe usare read_attribute():

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

Rotaie> = 5

Puoi usare read_attribute_before_type_cast

model.read_attribute_before_type_cast(:sale_info)
=> 1

1
@GrantBirchmeier ha aggiornato la risposta. Puoi usare read_attribute_before_type_cast.
ArashM

Prima di Rails 5, model.read_attribute ('sale_info') uguale a model [: sale_info]
zw963

1

La mia breve risposta è Model.sale_infos[:plan_2]nel caso in cui tu voglia ottenere valoreplan_2


1

Ho scritto un metodo nel mio modello per ottenere lo stesso risultato nella mia app Rails 5.1.

Per soddisfare il tuo caso, aggiungilo al tuo modello e chiamalo sull'oggetto quando necessario

def numeric_sale_info
  self.class.sale_infos[sale_info]
end
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.