プログラミング

「PG::UndefinedColumn」と言うエラーが出ました

こんにちは、Nanayakuです。

今回はタイトル通りエラー文で

PG::UndefinedColumn

が出たとき、何が原因だったか紹介します。

ちなみに、私はユーザー情報の削除(destroyアクション)で、このエラーが起きました。

カラムの間違い

私の最初のdestroyアクションのコードは以下のようになっていました。

def destroy
User.find_by(user_id: current_user.id).destroy
redirect_to root_path, success: '退会しました'
end

この問題は

User.find_by(user_id: current_user.id).destroy

にあります。

私は、Userモデルにあるログイン中のユーザーid(current_user.id)と一致するものを削除と定義していました。

しかし、Userテーブルに「user_id」と言うカラムはありません。

Userテーブルを参照するので、「id」でなければなりません

最終的に以下のようなコードになりました。

def destroy
User.find_by(id: current_user.id).destroy
redirect_to root_path, success: '退会しました'
end

 

関連付け先の削除

私は下の画像のように、UserテーブルとProfileテーブルを1対1のアソシエーション(関連付け)を行いました。

しかし、私は「app/models/user.rb」でユーザーを削除したら、そのuser_idを持つ他のテーブルのカラムも削除する定義をしていませんでした。

最初のコードは以下のように「dependent: :destroy」が書いていませんでした。

has_one :profile

↓訂正後

has_one :profile, dependent: :destroy

 

このエラーは、エラー文を翻訳すれば簡単にわかります。

原文

PG::ForeignKeyViolation: ERROR: update or delete on table "users" violates foreign key constraint "fk_rails_e424190865" on table "profiles" DETAIL: Key (id)=(6) is still referenced from table "profiles". : DELETE FROM "users" WHERE "users"."id" = $1

 

翻訳後

PG :: ForeignKeyViolation:エラー:テーブル "users"の更新または削除は、テーブル "profiles"の外部キー制約 "fk_rails_e424190865"に違反します詳細:Key(id)=(6)はまだテーブル "profiles"から参照されています。:DELETE FROM "users" WHERE "users"。 "id" = $ 1

何となく察しはつきますよね。

関連

ActiveRecordの削除method(delete, delete_all, destroy, destroy_all)で、それぞれどのような役割・処理内容か知りたい方は、下のqiita記事を参考にしてみて下さい。

delete, delete_all, destroy, destroy_allについて

 

まとめ

エラー文でPG::UndefinedColumnが出たら、

  • 参照しているカラムの確認
  • 関連テーブルとのオプション(削除など)の確認

を、行ってみて下さい。

 

最後に

備忘録がわりに作ったので、間違っている所とかあったら、コメントくれると嬉しいです。

-プログラミング
-

Copyright© Nanayaku blog , 2019 All Rights Reserved Powered by AFFINGER5.