ハッカソンで共同開発している、
「電車の混雑具合をユーザーに投稿してもらって、混雑具合を即時的に反映させていく」
というアプリの中で、メンバーの一人がenumを使っていて、「何それ?」ってなったので、enumについて調べてみた。
enumとは
DBに保存する定数を複数個設定できるもの。
例えばユーザーから混雑具合を選択してもらう際、
viewで
<%= form_with model: @post, local: true do |f| %>
<%= f.select :congestion_level, Post.congestion_levels.keys.map {|k| [k, k]}, {prompt:"混雑具合を選択してください"}, class: 'form-control' %>
<% end %>
というようにselectを使ってユーザー選択にさせ、DBに保存する際に enum を使って定数を設定していれば、受け取った値(key)に対応する値(value)をDBに保存することができる。
enumの設定
以下のようにenumを使用する際はモデルにkeyとDBに保存するvalueを指定。
Post.rb
enum congestion_level: { "着席できる" => 1, "座れないが立って乗れる" => 2, "座席の前で立てる" => 3, "立っているのがやっと" => 4, "乗り切れないほど混雑している" => 5 }
上記の例でいうと、
"着席できる" がviewで選択された際にはDBには 1 という数値が保存される。
"座れないが立って乗れる" が選択された際には 2 が保存される。
といった具合になる。
enumを使う上でのポイント
- 保存するカラムはboolernかinteger型のどちらかである必要がある
- 設定していた定数以外は保存できない(それ以外は弾いてくれる)
- モデルに保存するためのkeyとvalueを設定する
引っかかったポイント
当初、viewの記述が
<%= form_with model: @post, local: true do |f| %>
<%= f.select :congestion_level, Post.congestion_levels, {prompt:"混雑具合を選択してください"}, class: 'form-control' %>
<% end %>
となっていた為にエラーが発生していた。
本来なら
という流れが正しいのに対し、
- viewから 1 などの数値が送られる→ key: 1 に対応する valueがない → エラー
となっていた。
参考サイト
https://pikawaka.com/rails/enum
を参考に
viewで選択する値をenumで設定したkeyになるようにしたところエラーは解消された。