Jak uzyskać wartość całkowitą z enum w Rails?

Mam enum w moim modelu, który odpowiada kolumnie w bazie danych.

enum wygląda tak:

  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.

Author: Cleyton, 2014-08-29

5 answers

Możesz uzyskać wartości całkowite dla enum z klasy, na której znajduje się enum:

Model.sale_infos # Pluralized version of the enum attribute name

Który zwraca hash w stylu:

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

Możesz użyć wartości sale_info z instancji klasy Model, 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
 106
Author: Shadwell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-29 14:34:26

Możesz uzyskać liczbę całkowitą w następujący sposób:

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

Aktualizacja dla rails 5

Dla rails 5 powyższa metoda zwraca teraz wartość string: (

Najlepsza metoda jaką na razie widzę to:

my_model.sale_info_before_type_cast

Odpowiedź Shadwella nadal działa dla rails 5.

 107
Author: Subtletree,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-07 00:09:06

Rails

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

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

Rails > = 5

Możesz użyć read_attribute_before_type_cast

model.read_attribute_before_type_cast(:sale_info)
=> 1
 20
Author: ArashM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-01 06:38:13

Moja krótka odpowiedź brzmi Model.sale_infos[:plan_2] W przypadku, gdy chcesz uzyskać wartość plan_2

 0
Author: Brilliant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-21 08:37:02

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

Catering dla twojej sprawy, dodaj to do swojego modelu i wywołaj go na obiekcie w razie potrzeby

def numeric_sale_info
  self.class.sale_infos[sale_info]
end
 0
Author: shrmn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-27 15:21:50