こんにちは、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記事を参考にしてみて下さい。
まとめ
エラー文でPG::UndefinedColumnが出たら、
- 参照しているカラムの確認
- 関連テーブルとのオプション(削除など)の確認
を、行ってみて下さい。
最後に
備忘録がわりに作ったので、間違っている所とかあったら、コメントくれると嬉しいです。