窓際BLOG

プログラミングの学習メモや書籍の感想等を公開していきます。

Ruby on Rails:ModelのプロパティにEnumを使う※おまけ:ラジオボタンでEnumを扱う

Railsでステータス等の特定の値のリストを用いて値設定を行う場合にはEnumを使うと便利なので、手順をメモしておきますφ(..)

ちなみにEnumはRails4.1から導入されたActiveRecordの機能なので、Ruby単独では使えない点に注意してください(._.)
RubyEnumっぽいことやるには下記に手順をまとめているので、参考にしてください:D

madogiwa0124.hatenablog.com

手順

テーマ:性別(男女)を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を活用していきたいですね!

参考

qiita.com