Baby steps to migratory bird

元半導体系エンジニア、今Webエンジニアの雑記

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を使うのだとどちらがいいかは、今後調べたいです。