Ответ 1
Кредит: https://hackhands.com/ruby-on-enums-queries-and-rails-4-1/
Объявить атрибут enum, где значения отображаются в целые числа в базе данных, но могут быть запрошены по имени. Пример:
class Conversation < ActiveRecord::Base
enum status: [ :active, :archived ]
end
# conversation.update! status: 0
conversation.active!
conversation.active? # => true
conversation.status # => "active"
# conversation.update! status: 1
conversation.archived!
conversation.archived? # => true
conversation.status # => "archived"
# conversation.update! status: 1
conversation.status = "archived"
# conversation.update! status: nil
conversation.status = nil
conversation.status.nil? # => true
conversation.status # => nil
Также будут предоставлены области, основанные на разрешенных значениях поля перечисления. В приведенном выше примере он создаст активную и архивированную область.
Вы можете установить значение по умолчанию из объявления базы данных, например:
create_table :conversations do |t|
t.column :status, :integer, default: 0
end
Хорошей практикой является разрешение первого объявленного статуса по умолчанию.
Наконец, также можно явно сопоставить отношение между атрибутом и целым числом базы данных с Hash:
class Conversation < ActiveRecord::Base
enum status: { active: 0, archived: 1 }
end
Обратите внимание, что при использовании массива неявное сопоставление значений с целыми числами базы данных происходит из порядка, в котором значения отображаются в массиве. В примере: active сопоставляется с 0 как это первый элемент, а: заархивирован для отображения 1. В общем, i-й элемент сопоставляется с i-1 в базе данных.
Поэтому, как только значение добавляется в массив перечислений, его положение в массиве должно поддерживаться, а новые значения должны быть добавлены только в конец массива. Чтобы удалить неиспользуемые значения, следует использовать явный синтаксис Hash.
В редких случаях вам может потребоваться непосредственный доступ к сопоставлению. Отображения отображаются через метод класса с именем множественного атрибута:
Conversation.statuses # => { "active" => 0, "archived" => 1 }
Используйте этот метод класса, когда вам нужно знать порядковое значение перечисления:
Conversation.where("status <> ?", Conversation.statuses[:archived])
Если условия атрибута enum должны использовать порядковое значение перечисления.
Дополнительная информация: http://api.rubyonrails.org/v4.1.0/classes/ActiveRecord/Enum.html