Railsでステータス等の特定の値のリストを用いて値設定を行う場合にはEnumを使うと便利なので、手順をメモしておきますφ(..)
ちなみにEnumはRails4.1から導入されたActiveRecordの機能なので、Ruby単独では使えない点に注意してください(._.)
RubyでEnumっぽいことやるには下記に手順をまとめているので、参考にしてください:D
手順
テーマ:性別(男女)をEnumで設定する
今回は、性別というプロパティについて男と女という値をEnumで管理するケースを想定しました。
既存のUser
モデルについて、性別のプロパティを追加し、それをEnumで管理出来るようにします:D
実装
テーブル定義の変更
まずは既存のUserモデルについて性別(sex)プロパティを追加します。ポイントはInteger
型でプロパティを定義することですφ(..)
rails g migration add_sex_to_users sex:integer
class AddPropertiesToUsers < ActiveRecord::Migration[5.1] def change add_column :users, :sex, :integer end end
実装
テーブル定義を変更後、Enumをモデルに定義していきます。今回は1:男
、2:女
という定数をEnumで管理していきます。
Enumは、enum プロパティ名: { 値1: 1, 値2: 2 }
という形でモデルに定義します(._.)
class User < ApplicationRecord # 省略 enum sex: { man: 1, woman: 2 } # 省略 end
実際に登録されたデータを見てみると男は1
、女は2
で表示されます。
# DB上は、モデルで定義した数字で設定される e-navigator_development=# select id,username,sex from users; id | username | sex ----+----------+----- 1 | hogehoge | 2 3 | fuga_1 | 1 (2 rows)
登録したデータをアプリケーション上で確認してみると、モデルで定義した値woman
となります。
irb(main):001:0> user.id => 1 # モデルで定義された値"woman"が表示される。 irb(main):002:0> user.sex => "woman" # Enumの一覧を確認 irb(main):003:0> User.sexes => {"man"=>1, "woman"=>2}
おまけ:Enumのプロパティをラジオボタンとして表示する
Enumで定義したプロパティはテキストボックスではなく、ラジオボタンやセレクトボックスで定義したいので、今回はラジオボタンで表示するコードを下記に示しましたφ(..)
<div class="field"> <%= f.label :sex %><br /> <%= f.label :man %> <%= f.radio_button :sex, :man %> <%= f.label :woman %> <%= f.radio_button :sex, :woman %> </div>
Enumを使うとマジックナンバーをソースコードに記述しなくても良くなるので、可読性があがるので定数のリストを扱うプロパティには積極的にEnumを活用していきたいですね!