はじめに
ActiveRecordで、「type」というカラムをもつテーブルを作成した際に、エラーになったので、原因を備忘録として残します。
現状
-
Exerciseモデルを作成した際に、「運動の種類」=「type」でカラムを作成。
-
エクセルサイズの種類を登録した際に、下記のエラーになっている状況。
めちゃくちゃ怒られてますね
原因
- Single Table Inheritanceという1つのテーブルを複数のModelで利用する仕組みとして「type」という名前をActiveRecordが利用するからみたいです。
対処法
- 下記のRailsガイドにも記載されているとおり、違うカラム名へ変更します。
これらのカラム名は必須ではありませんが、Active Recordで予約されています。特別な理由のない限り、これらの予約済みカラム名の利用は避けてください。たとえば、typeという語はテーブルでSTI(Single Table Inheritance)を指定するために予約されています。STIを使わない場合であっても、予約語より先にまず「context」などのようなモデルのデータを適切に表す語を検討してください。
- migrationファイルを作成。
$ rails g migrate rename_[変更前のカラム名]_column_to_[モデル名(複数形)]
- 今回は、exercisesモデルのtypeを変更します。
$ rails g migration rename_type_column_to_exercises
- migrationファイルを編集。
生成されたファイルにchangeメソッドを追加し、変更したいカラム名を記述する。rename_column :テーブル名, :変更前のカラム名, :変更後のカラム名
今回は、「運動の種類」から「運動の名前」へ変更します。
def change
rename_column :exercises, :type, :name
end
- DBに反映するため、下記コマンドを実行します。
$ rails db:migrate
- 先程のエラーは、解消され、「type」がありませんというエラーに変わります。
type
にしていたところをname
へ変更します。
- 無事にexercises#indexが表示されました!
まとめ
今回のエラーは、初めてだったので、「おお、何これ?」という感じでしたが、エラー文をしっかり読むと、対処法が示されていたので、いつもよりサクッと解決できました!予約語という聞き慣れない言葉だったので、とても勉強になりました