じぶんメモ

プログラミングのメモ、日常のメモとか。

railsでenumを使う

modelに記述する。

class Post < ActiveRecord::Base
  enum status: { created: 0, drafted: 1, canceled: 2 }
end

こうすることで、Post.statusesとして、各Enumにアクセスすることができる。

pry(main)> Post.statuses            # => {"created"=>0, "drafted"=>1, "canceled"=>2}
pry(main)> Post.statuses[:drafted]  # => 1
pry(main)> @post = Post.new
pry(main)> @post.status = Post.statuses[:drafted]

また、インスタンスに対して、enumの各要素をメソッドとして使用することができる。

pry(main)> @post = Post.new
pry(main)> @post.status = Post.statuses[:drafted]
pry(main)> @post.drafted?     # => true
pry(main)> @post.canceled!
pry(main)> @post.canceled?    # => true
pry(main)> @post.drafted?     # => false

modelとの関連付けはせず、Enumとしてだけ使用したい場合、
locales下のymlファイルに記述する方法もあり。

ja:
  Enum:
    status:
      created: 0
      drafted: 1
      canceled: 2
pry(main)> Enum.codes(:status)
=> ["created", "drafted", "canceled"]

選択肢が限られているセレクトボックスの検証とかで、inclusionと合わせて使えそう。