Jak uzyskać wartość całkowitą z wyliczenia w Railsach?

105

Mam wyliczenie w moim modelu, które odpowiada kolumnie w bazie danych.

Do enumwygląda następująco:

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

Jak mogę uzyskać wartość całkowitą?

próbowałem

Model.sale_info.to_i

Ale to zwraca tylko 0.

Cleyton
źródło
Nie powinno Model.sale_info.value.to_i? np.Model.sale_info.plan_1.to_i
Florian Gl
Nie ... Ponieważ nie wiem, który planuje magazyn w bazie danych. Więc chcę go odzyskać i przesłać jakointeger
Cleyton

Odpowiedzi:

140

Wartości całkowite wyliczenia można pobrać z klasy, w której znajduje się wyliczenie:

Model.sale_infos # Pluralized version of the enum attribute name

To zwraca hash, taki jak:

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

Następnie możesz użyć wartości sale_info z instancji Modelklasy, aby uzyskać dostęp do wartości całkowitej dla tej instancji :

my_model = Model.find(123)
Model.sale_infos[my_model.sale_info] # Returns the integer value
Shadwell
źródło
139

Możesz uzyskać taką liczbę całkowitą:

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

Aktualizacja dla szyn 5

Dla rails 5 powyższa metoda zwraca teraz wartość ciągu :(

Najlepsza metoda, jaką na razie widzę, to:

my_model.sale_info_before_type_cast

Odpowiedź Shadwella działa również w przypadku szyn 5.

Subtletree
źródło
1
Dzieje się tak, ponieważ „enum” utworzy metodę sale_info dla twojego modelu, użyj [: sale_info], aby uzyskać wartość właściwości zamiast zwrotu z metody sale_info.
etlds
6
Zwróć uwagę, że ta metoda nie działa, jeśli model nie został zapisany. Wartość sale_info_before_type_cast (i my_model [: sale_info]) jest nadal ciągiem, jeśli do mojego_modelu.sale_info został przypisany ciąg bez późniejszego zapisu.
Tim Smith
42

Szyny <5

Innym sposobem byłoby użycie read_attribute():

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

Szyny> = 5

Możesz użyć read_attribute_before_type_cast

model.read_attribute_before_type_cast(:sale_info)
=> 1
ArashM
źródło
1
@GrantBirchmeier Zaktualizowano odpowiedź. Możesz użyć read_attribute_before_type_cast.
ArashM
Przed Railsami 5 model.read_attribute ('sale_info') równy modelowi [: sale_info]
zw963
1

Moja krótka odpowiedź brzmi Model.sale_infos[:plan_2]na wypadek, gdybyś chciał uzyskać wartośćplan_2

Brilliant-DucN
źródło
1

Napisałem metodę w moim modelu, aby osiągnąć to samo w mojej aplikacji Rails 5.1.

Przygotowując swoją sprawę, dodaj to do swojego Modelu i w razie potrzeby wywołaj na obiekcie

def numeric_sale_info
  self.class.sale_infos[sale_info]
end
krew
źródło