【Ruby on Rails】Active Recordのsave時にTypeErrorが発生したので対処
TL;DR
カラム名をRailsの予約語にしないように注意しよう
環境
OS: MacOS Monterey
Ruby version: 3.0.1
Rails version: 7.0.7
起きたこと
新規でRailsプロジェクトを作成し開発中、適当にレコードを作ろうとしてsave!
したところ以下のエラーが発生。
TypeError: no implicit conversion of String into Integer
backtraceを見る限り、エラーの大元はActiveRecordのソースコード奥深くらしい。
already_run_callbacks[record] ||= trigger_callbacks
空のハッシュalready_run_callbacks
に対して、recordをキーにbooleanを入れようとしたところエラーを吐いていた。
そんなところのバグを踏むか? いやそんなまさか。
原因
同じような例を調べたところ、以下のissueがヒット。
カラム名にhash
という名前を使っていたのがよろしくなかった。
他にもRailsの予約語には注意が必要。
参考: https://taremimi.hatenablog.jp/entry/2017/08/22/023407
(2017年の記事ですが、他に新しい記事が見つからなかったので。。。)
他の予約語で同様のエラーになるかは不明。別のエラー吐いてたらまた厄介だな。。。
対処
カラム名を変えることで対処。正常にsave!
できるようになった。
反省
カラム名に予約語使ってはいけないと知ってはいたものの、実際に踏んだことがなかったがために原因の特定に時間がかかってしまった。
というか、送出していたエラーがぱっと見た感じActiveRecordと関係なさそうなのが良くないと思う。。。
このあたりの記事(https://blog.turai.work/entry/20161024/1477306783)を見るに、数年前のバージョンではそのカラム名すでに定義済みってエラー出てたっぽい?
できればmigrationの時点で予約語だと教えてほしいな。。。
Discussion