woshidan's loose leaf

ぼんやり勉強しています

Enumerizeでenum値を扱う

Railsのモデルでenum値を扱うとき、enumerizeというgemを使うと便利です。

# Gemfile

gem 'enumerize'
class Task
  extend Enumerize
  enumerize :status, in: { pending: 0, todo: 1, done: 2 }
end

と書くと、

Task = Task.new(status: 'pending') #=> valid
Task = Task.new(status: 'unknown') #=> not valid

のようにバリデーションがかけられたり、

Task.where(status: :pending)

のように検索を行うことが可能です。

また、以下のようにlocaleを設定することで

# ja.yml
enumerize:
  task:
    status:
      pending: 待機中
      todo: 対応する
      done: 対応済
Task.status.options # => [["待機中", "pending"], ["対応する", "todo"], ["対応済", "done"]]

のように値を返すようになり、enum値の入力でよく使うselectフォームで

<%= form_for @task do |f| %>
  <%= f.select :task, Task.status.options %>
<% end %>

のように簡潔に記述できるようになります。

参考

doruby.jp

github.com