fluid_27’s blog

勉強した内容をアウトプットするためのブログ

railsのenumを初めて使ってみた

ハッカソンで共同開発している、

「電車の混雑具合をユーザーに投稿してもらって、混雑具合を即時的に反映させていく」

というアプリの中で、メンバーの一人が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から  "着席できる" などenumで設定していたkeyが送られる→ 保存する際に key: "着席できる" に対応する value: 1 が保存

という流れが正しいのに対し、

  • viewから  1 などの数値が送られる→  key: 1 に対応する valueがない → エラー

となっていた。

 

参考サイト

https://pikawaka.com/rails/enum

を参考に

viewで選択する値をenumで設定したkeyになるようにしたところエラーは解消された。