👏

【Rails】typeカラムを使ったらエラーが出た件

2023/04/14に公開

外部向けAPIを作成している際に、「type」というカラムを作成した。

そのテーブルにレコードを登録すると、以下のようなエラーが出た。

ActiveRecord::SubclassNotFound: Invalid single-table inheritance type: xxxxxxxxx is not a subclass of table_name

何が起きたのか。

chatGPTくん曰く...

エラーメッセージは、Railsアプリケーションのシングルテーブル継承(STI)の階層に問題があることを示しています。

具体的には、table_nameのサブクラスであるxxxxxxxxxというクラスが定義されているようですが、ActiveRecordがtable_nameクラスを見つけることができないということです。

このエラーを修正するには、次のことを確認する必要があります。

table_nameクラスが定義され、Railsアプリケーションに適切に読み込まれていることを確認してください。クラスが定義されているファイルを手動で読み込んでみて、問題が解決するかどうか確認できます。

継承の階層が正しく設定されていることを確認してください。特に、xxxxxxxxxクラスがtable_nameクラスを正しく継承していることを確認してください。

逆にわかりにくいような。。。でもヒントはSTIですね

結局なんなのか

STI(Single Table Inheritance)という1つのテーブルを複数のModelで利用する仕組みとして"type"という名前をActiveRecordが利用するため、それが影響して出たエラーっぽい。
要するに、エラーを見ると"type"をrenameしろと。

どうすればいいのか

カラムのリネームなんてしなくても全く問題ない。

該当のテーブルのモデルに以下を追記してやりましょう。

self.inheritance_column = :_type_disabled

まとめ

Rails実践ガイドでもtypeカラムを使った実装方法が載ってたような気がします。
Rails側が用意してくれるtypeカラムについて興味がある方は、ぜひ読んでみて!

Discussion