Fusic Advent Calendar 2016 19日目の記事です。
昨日はインターンのティム君の記事でした。プログラミングと出会った頃を思い出させてくれますね。
さて、予定が崩れて今日ドタバタで記事を書いてます。
残り1時間半。誕生日なのに…><
今日は、ぼくのかんがえたさいきょうのRailsのenum拡張gemについて書いてみる。
extended enumを略してexnum。さいきょうっぽい名前。英語的に合ってるかは知らない。
https://github.com/Kta-M/exnum
enumがこうだったらさいきょうだとぼくは思う
- I18nに対応している
- それぞれのステータスに紐付いた値を設定できる
というわけで、そうなるようにしてみた。
もちろん、enumに元から備わっている機能はそのまま使えるように。
I18n対応
たとえばUserモデル。
class User < ActiveRecord::Base
exnum role: {guest: 10, general: 20, admin: 30}
end
このときに、
ja:
activerecord:
enum:
user: # モデル名
role: # フィールド名
guest: ゲスト
general: 一般ユーザー
admin: 管理者
としておけば、
User.roles_i18n
# => {"guest" => "ゲスト", "general" => "一般ユーザー", "admin" => "管理者"}
user = User.new(role: :guest)
user.role_i18n
# => "ゲスト"
となる。さいきょう。
それぞれのステータスに紐付いた値を設定できる
なんかenumを使ってると、
「このステータスのときはああして、このステータスのときはこうして…」とかいうのがよく出てきて、せっかくenum使ってるのに結局case文書かんといかんのかい、ということがしばしば。
じゃあもう一緒にパラメータを設定できるようにしちゃえ!ということで。
たとえば、ステータスに応じて表示時のラベルの色を変えたかったり、パーミッションを設定したかったりする。
class User < ActiveRecord::Base
# valの値が本来のenumの値
# それ以外が関連パラメータ
exnum role: {
guest: {val: 10, label: :red },
general: {val: 20, label: :green, permission: false },
admin: {val: 30, label: :blue, permission: true},
}
end
こうしておくと、
User.role_labels
# => {"guest" => :red, "general" => :green, "admin" => :blue}
User.role_permissions
# => {"guest" => nil, "general" => false, "admin" => true}
user = User.new(role: :general)
user.role_label
# => :green
user.role_permission
# => false
さいこう。
まとめ
さいきょうでさいこう。
明日は上腕二頭筋がスバラシイ今年の新卒、ジョンくんの記事です。
その二の腕でタイプされるPHPの記事に期待です。