ЯoomeR

プログラミング~実装とエラー解決と、時々、AI~

FormObjectでアソシエーションを使えない理由

前提:FormObjecgtのモデル、テストでアソシエーションを使えない

FormObjectでアソシエーションを記述したり、RSpecなどのテストファイルでアソシエーションを使用することはできない。

FormObjectは厳密には他のモデルとは異なるので、アソシエーションを使用することができない。

(よって、belongs_toなどによるnull: falseの担保もできないのだ。)

モデルをincludeしてるのに使えない?

class DoubleForm
  include ActiveModel::Model
end

FormObjectを実装する際には上記のように「ActiveModel::Model」をincludeしている。

直感的には、「モデルの能力を取り入れているわけだから、アソシエーションも使えるんじゃないの?」と感じる。

associationはどこにあるのだろうか?

module ActiveRecord
  module Associations
  end
end

上記の通り、AssociationはActiveRecordの中で定義されている。

ActiveModelとActiveRecordの関係

Githubを見てみると、ActiveModelとActiveRecordディレクトリが異なっていることがわかる。

よって、ActiveModelをincludeしただけのFormObjectではアソシエーションを使用できないのである。

備考:そもそも論

そもそも「複数のテーブルにデータを保存するためのフォームのオブジェクト」であるから、その範疇で考えるべきである。