ホーム DoRuby [Ruby on Rails] enumerizeの使い方

[Ruby on Rails] enumerizeの使い方

この記事はアピリッツの技術ブログ「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のページをご覧ください!

記事を共有

最近人気な記事