Як отримати ціле значення від перерахунку в Rails?


105

У моїй моделі є перерахунок, який відповідає стовпцю в базі даних.

У enumвиглядає наступним чином :

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

Як я можу отримати ціле значення?

Я намагався

Model.sale_info.to_i

Але це лише повертає 0.


Чи не повинно бути Model.sale_info.value.to_i? наприкладModel.sale_info.plan_1.to_i
Флоріан Гл

Nops ... Тому що я не знаю, який план зберігає його в базі даних. Тому я хочу відновити його і подати його якinteger
Клейтон,

Відповіді:


140

Ви можете отримати цілі значення для enum з класу, на якому перебуває enum:

Model.sale_infos # Pluralized version of the enum attribute name

Це повертає хеш, як:

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

Потім ви можете використовувати значення sale_info з екземпляра Modelкласу для доступу до цілого значення для цього примірника :

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

139

Ви можете отримати ціле число таким чином:

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

Оновлення для рейок 5

Для рейок 5 вищевказаний метод тепер повертає значення рядка :(

Найкращий метод, який я зараз бачу, це:

my_model.sale_info_before_type_cast

Відповідь Шадвелла також продовжує працювати для рейок 5.


1
Це тому, що 'enum' створить метод sale_info для вашої моделі, використовуйте [: sale_info], щоб отримати значення властивості замість повернення з методу sale_info.
etlds

6
Зауважте, що цей метод не працює, якщо модель не збережена. Значення sale_info_before_type_cast (і my_model [: sale_info]) все ще є рядком, якщо йому my_model.sale_info було призначено рядок без наступного збереження.
Тім Сміт

42

Рейки <5

Іншим способом було б використання read_attribute():

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

Рейки> = 5

Можна використовувати read_attribute_before_type_cast

model.read_attribute_before_type_cast(:sale_info)
=> 1

1
@GrantBirchmeier Оновлено відповідь. Можна використовувати read_attribute_before_type_cast.
АрашМ

Перед Rails 5 модель.read_attribute ('sale_info') дорівнює моделі [: sale_info]
zw963

1

Моя коротка відповідь Model.sale_infos[:plan_2]на випадок, якщо ви хочете отримати цінністьplan_2


1

Я написав метод у своїй моделі, щоб досягти того ж у своєму додатку Rails 5.1.

Обслуговуючи свій випадок, додайте це у свою Модель та зателефонуйте на об’єкт, коли потрібно

def numeric_sale_info
  self.class.sale_infos[sale_info]
end
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.