【Rails初学者】不要になったカラム(memo_id)を削除したのにエラーが出続けた話とその解決法
はじめに
Railsで開発中、テーブル設計の変更により、memo_id
カラムを visits
テーブルから削除しました。
しかし、その後もなぜか memo_id
を参照しようとして PG::UndefinedColumn
エラーが出続けてしまいました。
こちらの記事は、自分の備忘録として、実際にハマった原因と、その解決方法をまとめます。
起きたこと
- 初期設計で、
visits
テーブルにはmemo_id
(外部キー)カラムが存在していた - 設計見直しにより、
memo
は単なるtext
カラムとしてvisits.memo
に直接保存するように変更 - 以下のマイグレーションで
memo_id
を削除
class RemoveMemoIdFromVisits < ActiveRecord::Migration[8.0]
def change
remove_column :visits, :memo_id, :integer
end
end
-
schema.rb
からもmemo_id
は削除されたことを確認
それでも出続けたエラー
PG::UndefinedColumn: ERROR: column "memo_id" of relation "visits" does not exist
LINE 1: ... "has_document", "memo_id", ...
memo_id
は、もう削除したはずなのに
原因①:フォームやStrong Parametersの残骸
真っ先に疑ったのは、フォームやコントローラ。
-
visit_params
にmemo_id
はなし - ビューにも
f.hidden_field :memo_id
のような記述なし - モデルに
belongs_to :memo
もなし
原因②:test/fixtures/visits.yml
にmemo_id:
が残っていた
確認したところ、これが原因でした
# test/fixtures/visits.yml
one:
user_id: 1
visit_date: 2025-06-20
memo_id: 1 # ← これが残っていた
サーバーを再起動
bin/dev
# または
bin/rails server
まとめ
- カラムを削除したのにエラーが出る場合、
fixtures/*.yml
を見落としがち - Railsは
fixture
を元にカラム情報を推論することがある -
grep memo_id
で一括検索すると見逃しを防げる
最後に
開発中もう消したはずのカラムがなぜか参照されるという場合は、
test/fixtures
も忘れずにチェックする。
初学者のため、間違えていたらすいません。