Статьи

Совет: используйте Enums в Rails для сопоставленных значений

Когда я работал в колл-центре, мы отмечали случаи с разными статусами. Это позволило высшему руководству определить, где находятся дела, какие существуют узкие места и поток вызовов. К счастью, прошло много времени с тех пор, как я работал в колл-центре, но я размышлял, как бы я справился с этой задачей с помощью Rails. К счастью, у Rails есть решение, известное как Enums .

Когда вы добавляете статусы в модель, у вас может возникнуть желание использовать строки для установки статуса. Это имеет смысл, потому что разные статусы обычно называются «ожидающими», «проверяемыми» и «завершенными».

Однако Rails рекомендует вам использовать Enums для замены этих строк на целые. Сначала это кажется нелогичным, но на самом деле идеально подходит для решения этой проблемы.

Перечисления позволяют сопоставить строковые значения с целыми числами в базе данных, чтобы их можно было запрашивать по имени:

class CustomerCase < ApplicationRecord enum status: [:open, :closed,:under_review, :pending] end 

Теперь в консоли Rails мы можем сделать следующее:

 $ customer_case.open? 

Мы можем даже использовать области:

 $ CustomerCase.open 

Чтобы мы могли по-настоящему практиковать использование Enums, я настоятельно рекомендую создать небольшое приложение Rails:

 $ rails new call_center 

Перейдите в этот каталог и создайте быстрый каркас с большим количеством атрибутов:

 $ rails generate scaffold CustomerCase title:string description:text status:integer agent:string 

Обратите внимание, что поле status является целым числом .

Перенос базы данных:

 $ rails db:migrate 

Откройте app / models / customer_case.rb и введите следующее:

 class CustomerCase < ApplicationRecord enum status: [:open, :closed, :under_review, :pending] end 

Теперь у нас есть небольшое приложение. Давайте сами создадим пару случаев с различными атрибутами в консоли rails c ( rails c ):

 $ CustomerCase.create(title: "Case 1", description: "Our first case", status: :open, agent: "Me") => #<CustomerCase id: 1, title: "Case 1"...status: "open" $ CustomerCase.create(title: "Case 2", description: "Our second case", status: :pending, agent: "Me") => #<CustomerCase id: 2, title: "Case 2"...status: "pending" 

Также неплохо изменить строку в app / views / customer case / form.html.erb, которая соответствует Enums , чтобы вы могли выбрать действительные статусы:

 ... </div> <div class="field"> <%= f.label :status %><br> <%= f.collection_select :status, CustomerCase.statuses.map{ |a| [a.first,a.first] }, :first, :second %> </div> 

Я предлагаю создать как можно больше различных случаев и протестировать различные возможности из консоли Rails:

 $ bundle exec rails c $ cse = CustomerCase.create(title:"Case Title", description:"what has happend", status: "open" ) $ cse.open? => true $ cse.closed? => false $ cse.pending? => false $ CustomerCase.open.to_a CustomerCase Load (0.1ms) SELECT "customer_cases".* FROM "customer_cases" WHERE "customer_cases"."status" = ? [["status", 0]] => #<ActiveRecord::Relation.. 

Последний пример вызова open области показывает SQL, используемый для запроса базы данных. Запрос использует 0 для значения, а не для open , как ожидалось.

Вы также можете изменить статус дела:

 $ cse.pending! 

(0,1 мс) начать транзакцию
SQL (1.0ms) ОБНОВЛЕНИЕ «клиентские случаи» SET «статус» =?, «Обновлено в» =? ГДЕ « дела клиентов ». «Id» =? [[«Status», 3], [«обновлено в», 2016-10-05 13:34:28 UTC], [«id», 3]]
(0.6ms) совершить транзакцию
=> правда

При правильном использовании перечисления могут быть отличным дополнением к созданию читаемого кода. Теперь, когда мы изучили Enums вместе с возможным вариантом использования, я надеюсь, что это упростит внедрение других связанных с Enum функций в ваше приложение Rails.