PG::NotNullViolation: ERRORを解消する
DBにとあるレコードを保存しようとしたところ、下記のエラーにハマったのでそのメモ。
ActiveRecord::NotNullViolation: PG::NotNullViolation: ERROR: null value in column "hoge_cd" violates not-null constraint DETAIL: Failing row contains (fuga, ccc, 2019-04-01, 2019-04-03). : INSERT INTO "foo" ("bar_id", "hoge_type_cd", "created_at", "updated_at") VALUES ($1, $2, $3, $4,) RETURNING "id"
※テーブル構造やデータは若干修正しています
環境
- 言語: Ruby 2.4
- FW: Rails 5.1
- DB: PostgreSQL
状況
- hoge_typeに対してsimple_enumでenumを利用
- shemaの定義は大丈夫そう
- as_enumもモデルに記述済
# db/schema.rb create_table "foo", force: :cascade do |t| t.integer "baar_id", null: false t.integer "hoge_type_cd", default: 1, null: false t.datetime "created_at" t.datetime "updated_at" end
# app/models/foo.rb class Foo < ActiveRecord::Base as_enum :hoge_type, { xxx: 1, yyy: 2, zzz: 3, }, prefix: true end
結論
定義も大丈夫だしなんでエラーが出るんじゃ!と悶々してたんですが、 結論としてはhoge_enumに対してas_enumで定義していない値(今回はccc)を保存しようとしているのが原因でした。
# app/models/foo.rb class Foo < ActiveRecord::Base as_enum :hoge_type, { xxx: 1, yyy: 2, zzz: 3, ccc: 4, # ここに追記 }, prefix: true end
辿り着くまでに見た記事など
Rails標準のenumとgemを使うのだとどちらがいいかは、今後調べたいです。