📝

Ruby on Rails でenumを使ってみる

2023/06/16に公開

今日はenumについて、Ruby on Railsでの設定方法や使い方を軽くまとめていきます。

enumとは?

enumは列挙型とも言われます。
もともとはC言語やJavaで使われている定数の扱い方の種類のひとつで、例えば「曜日」のように定数の種類と数が明確に決まっていて、それを1つの集合体として扱いたい時に定義する型です。
enumを使用すれば、文字列に対して整数を割り当てることができます。この場合テーブルに保存されるのは整数の方ですが、プログラム内では文字列(意味を持った単語)を記述に使用できるので可読性があがります。

enumを設定する

それでは、前回作成したプロフィール登録アプリの性別入力欄をenumに変更してみたいと思います。

まずはカラム型をintegerに変更します。
マイグレーションファイルを作成して、profilesテーブルのsexカラムの型をintegerにします。

rails g migration change_data_sex_to_profile
class ChangeDataSexToProfile < ActiveRecord::Migration[6.0]
  def change
    change_column(:profiles, :sex, :integer)
  end
end



マイグレーションを実行したら、
次はProfileモデルのファイルにてsexカラムをenumにする記述をします。

class Profile < ApplicationRecord
  has_and_belongs_to_many :hobbies

# 下記を追加で記述
  enum sex: { male: 1, female: 2 }

end

これで完了です。簡単!

enumを使用した場合のデータ登録

前回作成したラジオボタンでの性別選択フォームは下記のような記述でした。

<%= form.radio_button :sex, :male %>
<%= form.label :sex_male, "男性" %>

<%= form.radio_button :sex, :female %>
<%= form.label :sex_female, "女性" %>

enumに変更しても、これはそのまま使えます!
変わるのは、テーブルに保存されるデータです。設定した数値で保存されます。

enumこんなことができるよ

enumを設定する理由のひとつが、データの保存は整数だけどもプログラム内では文字列で記述可能、という点でした。その実例をひとつあげてみます。

例)profilesテーブルから性別:女性のレコードを取得したい。
enum使用の記述例) Profile.where(sex: "female")

Profile.where(sex: 2) と書いても同じ結果が得られますが、enumを使っている場合のほうが可読性が高いです。

また、Railsでenumを使用するとメソッドが定義されます。
例えば、こんなメソッドです。

[4] pry(main)> person = Profile.find(2)
  Profile Load (1.8ms)  SELECT `profiles`.* FROM `profiles` WHERE `profiles`.`id` = 2 LIMIT 1
=> #<Profile:0x0000558779f45320
 id: 2,
 name: "まこと",
 sex: "male",
 created_at: Fri, 16 Jun 2023 07:22:48 UTC +00:00,
 updated_at: Fri, 16 Jun 2023 07:22:48 UTC +00:00>
[5] pry(main)> person.female?
=> false

メソッド「female?」はenumを設定したことで作られたメソッドです。


Railsでenumを使う際には下記の記事がとても参考になりますのでどうぞ↓

https://techracho.bpsinc.jp/hachi8833/2022_02_18/115735

Discussion