LoginSignup
11
3

More than 5 years have passed since last update.

ぼくのかんがえたさいきょうのRailsのenum

Posted at

Fusic Advent Calendar 2016 19日目の記事です。
昨日はインターンのティム君の記事でした。プログラミングと出会った頃を思い出させてくれますね。

さて、予定が崩れて今日ドタバタで記事を書いてます。
残り1時間半。誕生日なのに…><

今日は、ぼくのかんがえたさいきょうのRailsのenum拡張gemについて書いてみる。
extended enumを略してexnum。さいきょうっぽい名前。英語的に合ってるかは知らない。
https://github.com/Kta-M/exnum

enumがこうだったらさいきょうだとぼくは思う

  • I18nに対応している
  • それぞれのステータスに紐付いた値を設定できる

というわけで、そうなるようにしてみた。
もちろん、enumに元から備わっている機能はそのまま使えるように。

I18n対応

たとえばUserモデル。

user.rb
class User < ActiveRecord::Base
  exnum role: {guest: 10, general: 20, admin: 30}
end

このときに、

translation_ja.yml
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文書かんといかんのかい、ということがしばしば。
じゃあもう一緒にパラメータを設定できるようにしちゃえ!ということで。

たとえば、ステータスに応じて表示時のラベルの色を変えたかったり、パーミッションを設定したかったりする。

user.rb
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の記事に期待です。

11
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
3