Wie erhalte ich einen ganzzahligen Wert aus einer Aufzählung in Rails?

105

Ich habe eine Aufzählung in meinem Modell, die der Spalte in der Datenbank entspricht.

Das enumsieht aus wie:

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

Wie kann ich den ganzzahligen Wert erhalten?

ich habe es versucht

Model.sale_info.to_i

Dies gibt jedoch nur 0 zurück.

Cleyton
quelle
Sollte es nicht sein Model.sale_info.value.to_i? zBModel.sale_info.plan_1.to_i
Florian Gl
Nein ... Weil ich nicht weiß, welcher Plan seinen Speicher in der Datenbank hat. Also möchte ich es wiederherstellen und alsinteger
Cleyton

Antworten:

139

Sie können die ganzzahligen Werte für eine Aufzählung aus der Klasse abrufen, in der sich die Aufzählung befindet:

Model.sale_infos # Pluralized version of the enum attribute name

Das gibt einen Hash zurück wie:

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

Sie können dann den Wert sale_info aus einer Instanz der ModelKlasse verwenden, um auf den ganzzahligen Wert für diese Instanz zuzugreifen :

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

Sie können die ganze Zahl so erhalten:

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

Update für Schienen 5

Für Schienen 5 gibt die obige Methode jetzt den Zeichenfolgenwert zurück :(

Die beste Methode, die ich jetzt sehen kann, ist:

my_model.sale_info_before_type_cast

Shadwells Antwort funktioniert auch weiterhin für Schienen 5.

Teilbaum
quelle
1
Da 'enum' eine Methode sale_info für Ihr Modell erstellt, verwenden Sie [: sale_info], um den Eigenschaftswert abzurufen, anstatt von der Methode sale_info zurückzukehren.
etlds
6
Beachten Sie, dass diese Methode nicht funktioniert, wenn das Modell nicht gespeichert wurde. Der Wert sale_info_before_type_cast (und my_model [: sale_info]) ist weiterhin eine Zeichenfolge, wenn my_model.sale_info eine Zeichenfolge ohne nachfolgendes Speichern zugewiesen wurde.
Tim Smith
42

Schienen <5

Ein anderer Weg wäre zu verwenden read_attribute():

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

Schienen> = 5

Sie können verwenden read_attribute_before_type_cast

model.read_attribute_before_type_cast(:sale_info)
=> 1
ArashM
quelle
1
@GrantBirchmeier Die Antwort wurde aktualisiert. Sie können verwenden read_attribute_before_type_cast.
ArashM
Vor Rails 5 entspricht model.read_attribute ('sale_info') dem Modell [: sale_info]
zw963,
1

Meine kurze Antwort ist Model.sale_infos[:plan_2]für den Fall, dass Sie Wert von erhalten möchtenplan_2

Brilliant-DucN
quelle
1

Ich habe in meinem Modell eine Methode geschrieben, um dasselbe in meiner Rails 5.1-App zu erreichen.

Fügen Sie dies Ihrem Modell hinzu und rufen Sie es bei Bedarf auf dem Objekt auf

def numeric_sale_info
  self.class.sale_infos[sale_info]
end
shrmn
quelle