その他
    ホーム技術発信DoRuby 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のページをご覧ください!