😇

【Ruby on Rails】Active Recordのsave時にTypeErrorが発生したので対処

2023/10/07に公開

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のソースコード奥深くらしい。
https://github.com/rails/rails/blob/522c86f35ccc80453ed9fb6ca8b394db321f9a69/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb#L154C47-L154C47

already_run_callbacks[record] ||= trigger_callbacks

空のハッシュalready_run_callbacksに対して、recordをキーにbooleanを入れようとしたところエラーを吐いていた。
そんなところのバグを踏むか? いやそんなまさか。

原因

同じような例を調べたところ、以下のissueがヒット。
https://github.com/rails/rails/issues/45879

カラム名にhashという名前を使っていたのがよろしくなかった。
他にもRailsの予約語には注意が必要。
参考: https://taremimi.hatenablog.jp/entry/2017/08/22/023407
(2017年の記事ですが、他に新しい記事が見つからなかったので。。。)

他の予約語で同様のエラーになるかは不明。別のエラー吐いてたらまた厄介だな。。。

対処

カラム名を変えることで対処。正常にsave!できるようになった。

反省

カラム名に予約語使ってはいけないと知ってはいたものの、実際に踏んだことがなかったがために原因の特定に時間がかかってしまった。

というか、送出していたエラーがぱっと見た感じActiveRecordと関係なさそうなのが良くないと思う。。。
このあたりの記事(https://blog.turai.work/entry/20161024/1477306783)を見るに、数年前のバージョンではそのカラム名すでに定義済みってエラー出てたっぽい?

できればmigrationの時点で予約語だと教えてほしいな。。。

Discussion