ぼくらの研究

ぼくらのための研究をしていきます。

[Rails]belongs_toで外部キーが認識されない時にチェックした方がいいこと

   

現象

環境: Rails 5.2.2

CenterモデルとItemモデルがある。

Itemモデルはbelogs_to :centerでCenterモデルに紐づけていてItemモデルはcenter_idという外部キーを持っている。


class Item < ApplicationRecord
 belongs_to :center
end

 

この状態で


Item.create(center_id: 1)

と紐付いているモデルのidを入れてcreateしても、作成失敗し、rollback処理が行われる。
同様にbelongs_to :centerで関連付けし、center_idの外部キーを持っている他のモデルは何の問題もなく作成できるのに、なぜかこのモデルだけエラーが発生する。

原因

結論を言うと、関連付けしているモデルと同名のインスタンスメソッドを作っていたことが理由だった。


def center
 xxxxx
end

モデルのCenterは施設のセンターを指しているのだが、インスタンスメソッドのセンターは中心という意味で命名しており、意味は違う。ただし名前はどちらもcenter。
最初はRails 5から変更されたbelongs_toの挙動変更(defaultでrequire:trueになっている仕様)周りが原因かと思ったが、とんだヒューマンエラーだった。

解決法

もはや説明の必要もないとは思うが、名前が重複していたインスタンスメソッドの名称を変更した。

Railsは命名が大事だなーと思う場面に遭遇するなぁ。(今回のはそんなレベルではなく単なるポカでしたが)