何が起きた?
例えばUserモデルにstatusというカラムがあるとする
usersテーブルの中身はこう!
id | status |
---|---|
1 | 1 |
2 | 2 |
enumを定義したカラムの値を取得してもnilとなってしまう
例えばUserモデルにstatusというカラムがあるとする
class User < ApplicationRecord
enum status: { economy: 1, vip: 2 }
end
rails cでstatusを表示すると以下のようになる
$ rails c
$ [1] pry(main)> User.find(1).status
$ => nil
え?
それどころかデータを見てもnilなのだ
$ rails c
$ [1] pry(main)> User.find(1)
$ => User
$ id: 1
$ status: nil
それはもうおかしいじゃん。ダメじゃんそんなの!
聞いてないって!!!
enumの定義を消すと値は取得できる。
class User < ApplicationRecord
# enum status: { economy: 1, vip: 2 }
end
rails cでstatusを表示すると以下のようになる
$ rails c
$ [1] pry(main)> User.find(1).status
$ => "1"
んなんでだ?
想定していた動き
class User < ApplicationRecord
enum status: { economy: 1, vip: 2 }
end
rails cでstatusを表示すると以下のようになる
$ rails c
$ [1] pry(main)> User.find(1).status
$ => "economy"
こうなると思っている。何もおかしくない。俺は間違っていない。うわああああああああああ
原因はカラムの型の定義だった
これは気付くのに時間がかかりました。
マイグレーションを使っていないのですが簡単に書くと
# 数値で定義すべきところが
integer :status
# 文字列になっていた
string :status
お...俺じゃ無いんだ...これを書いたのは...
結論
enumを使えるのは整数型のカラムだけ!
別のカラムを追加して確認してみたりすると気付けるぞー。