Rails 5.2で1:Nを同一モデルで結合する時にparent_idが必須項目化してエラーが出る問題

この記事を書いたひと: @t4traw 2019年2月13日

Rails 5.2(といか5.x)で、1:Nの関係性を同一モデルで行おうとした時、parent_idが必須項目扱いになってエラーがでる問題に遭遇しました。

具体的に言うとこんなコードでエラーが発生しました。

class User < ApplicationRecord
  belongs_to :parent, class_name: 'User'
  has_many :children, class_name: 'User', foreign_key: 'parent_id', dependent: :destroy
end

belongs_toなんだからnilはありえないよね?という解釈らしく、これはどうしたものか……とググったらスパっと解決方法を書いてくれた紳士がいました。

参考: Rails5の自己結合でハマる - Qiita

belongs_toでoptional: trueを渡せば良いらしいです。さっそく以下のように修正してtestしてみました。

class User < ApplicationRecord
  belongs_to :parent, class_name: 'User', optional: true
  has_many :children, class_name: 'User', foreign_key: 'parent_id', dependent: :destroy
end

無事テストが通りました。

それでは。