1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Rails】モデルのカラムで選択肢を指定したいときはenumerize gemを使おう

Last updated at Posted at 2023-02-07

どうした?

ToDoアプリを作成しています。
各Todoに対して

  • waiting(未着手)
  • working(仕掛中)
  • done(完了)

の選択肢を持ったstatusカラムを付与する時に便利になりそうなenumerize gemを導入し、設定する方法をアウトプットします。

手順

gemのインストール

Gemfileにenumerizeを記載します。

gem 'enumerize'

記載したらbundle installしましょう。

モデルに選択肢を設定

マイグレーションファイル
マイグレーションファイルにて、Todoモデルにstatusカラムを付与する指示を与えます。
このとき、新規レコード作成時にバリデーションに引っかかるのを防ぐためにデフォルト値を指定すると良いでしょう。

t.string :status, null: false, default: :waiting

モデル
モデルファイルでstatusの選択肢を配列形式で与えます。
Enumerizeモジュールの呼び出しも忘れずにおこないましょう。

extend Enumerize
enumerize :status, in: %i(waiting working done)

seed(おまけ)
サンプルデータを作るときのコツです。
例えば100個のデータにstatusをランダムで与えたいとき、次のように指定します。

todos_array = []
100.times do
  statuses = %w(waiting working done)
  todos_array << {
    # 略
    status: statuses[rand(3)]
  }
end

Todo.create!(todos_array)

rand(n)は0~n-1の間の整数をランダムに返すメソッドです。
statusesは配列なので、statuses[n]は配列のn番目を出力します。
この値をstatusカラムに指定すれば、ランダムなステータスを代入することができます。

日本語設定

選択肢を日本語設定しましょう。
config/locales/ja.ymlに以下のように指示します。

ja:
# 略
  enumerize:
    todo:
      status:
        waiting: 未着手
        working: 仕掛中
        done: 完了

確認

rails cでコンソールに入り、選択肢を確認します。

Todo.status.options
=> [["未着手", "waiting"], ["仕掛中", "working"], ["完了", "done"]]

無事に3つの選択肢が設定されていることが確認できました。

さらに、設定した値は以下の方法で取得することができます。

todo = Todo.first

# statusの物理値をそのまま出力
todo.status
=> "waiting"

# statusの値を日本語で出力
todo.status_text
=> "未着手"

選択肢フォームに実装

html.erbファイルで選択肢フォームを実装するときは、form_withブロックの中で下記のように指定します。

<%= f.select :status, Todo.status.options %>

このとき、オプションにはTodo.status.optionsを指定していることに注目してください。
これにより、以下のようなHTMLが出力されます。

<select name="status" id="status">
  <option value="waiting">未着手</option>
  <option value="working">仕掛中</option>
  <option value="done">完了</option>
</select>

これにより、日本語で選択し、物理名で登録することができます。
これは、Todo.status.options["日本語表記", "物理名"]の配列からなる配列になっているためです。
つまり、上のフォームを展開すると以下のようになります。

<%= f.select :status_text, [["未着手", "waiting"], ["仕掛中", "working"], ["完了", "done"]] %>

詳しくは下の記事と形を比べてみましょう。

まとめ

以上でRailsでenumerize gemを導入し、モデルのカラムを選択肢から選べるようになりました。
enumerize gemは本記事で紹介した以外にも独自メソッドを持ちます。
機能を最大限に使いこなせるようになりたいです。

参考

1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?