この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
Railsのgem、enumerizeの使い方のご紹介。
■ 列挙型とは?
列挙型とは、定数のリストを定義することができる型のことです。
使い道は様々ですが、ActiveRecordのvalueと組み合わせる方法が便利です。
■ 定数を利用する場合
例えば、DBのユーザテーブルに「性別」というカラムがあったとします。
性別には当然「男」と「女」の2パターンがあります。
この性別のフォームを作る場合どうしたらいいでしょうか?
まず、modelに定数を宣言する方法があります。
app/models/user.rb
class User < ActiveRecord::Base
SEX = { male => '男', famale => '女' }.freeze
end
app/views/users/_form.html.haml
.form-inputs
= f.input :sex, collection: User::SEX.invert, include_blank: false
値が少ない場合は上記でも問題なさそうですが、値が増えた場合やI18nで多言語化をしている場合、modelの記述が膨れ上がります。
■ enumerizeを利用する場合
そこで列挙型の出番です。
Rails4.1からはActiveSupportでenumが使えるようになったのですが、I18nには非対応のようです。
ですので、gemのenumerizeが便利です。ActiveRecordとI18nに対応しています。
【GitHub/enumerize】
https://github.com/brainspec/enumerize
※インストール方法は上記リンク先を参照ください。
app/models/user.rb
class User < ActiveRecord::Base
extend Enumerize
enumerize :sex, in: [:male, :female]
end
※extendで上手く読み込まれない場合、includeしてみてください。
多言語化する場合は「enumerize」というネームスペースを使います。
config/locales/models/ja.yml
ja:
enumerize:
user:
sex:
male: 男性
female: 女性
app/views/users/_form.html.haml
.form-inputs
= f.input :sex, collection: User.sex.options, include_blank: false
valueも以下のように取得できます。
@user.sex_text
#=> 男性
■ 最後に
選択肢が多いカラム定義の際に特に便利かと思います。
他にも色々なメソッドが使えるようになっていますので、ぜひGitHubのページをご覧ください!