こんにちは、鈴木です。
先日、Rails 4.1.0.rc1 がリリースされました。
リリースノートをパラパラを見ていたら ActiveRecord enums という新機能があったので試してみました。
ActiveRecord enums とは
会員のデータを保持する users テーブルを作成して、会員ステータスを保持する status カラムを用意して、その値が 0 なら仮登録、1 なら本登録、2 なら退会済みにしよう、・・・ということって良くありますよね?
ActiveRecord enums は、モデルクラスでこんな風に使います。
1 2 3 4 5 6 |
class User < ActiveRecord::Base # ステータス: temporary (仮登録), active (本登録), resign (退会). enum status: %i(temporary active resign) end |
こうしておくと以下のように使うことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# status が 1 (active) なユーザを取得する. user = User.active.first! # status は 0 (temporary) ではない. user.temporary? # => false # status を確認. user.status # => "active" # status を 2 (resign) に変更! user.resign! # status の取る値を確認. User.statuses # => {"temporary"=>0, "active"=>1, "resign"=>2} |
ActiveRecord enums を使うと自動的に scope が定義されたり、値を変更するメソッド (resign! など) が定義されるようです。列挙型のようなことを簡単に実現することができますね。
DB に登録される値を 0, 1, 2, ... 以外にする
enum status: %i(temporary active resign) という具合に enum の第二引数に配列を渡した場合、DB に登録される値は 0, 1, 2, ... になります。他の値に設定したい場合は、以下のように Hash で指定します。
1 2 3 4 5 6 |
class User < ActiveRecord::Base # ステータス: temporary (仮登録), active (本登録), resign (退会). enum status: {temporary: 10, active: 20, resign: 30} end |
こうすることで、temporary なら 10, active なら 20, resign なら 30 が DB に登録されるようになります。