- 前提:FormObjecgtのモデル、テストでアソシエーションを使えない
- モデルをincludeしてるのに使えない?
- associationはどこにあるのだろうか?
- ActiveModelとActiveRecordの関係
- 備考:そもそも論
前提: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ではアソシエーションを使用できないのである。
備考:そもそも論
そもそも「複数のテーブルにデータを保存するためのフォームのオブジェクト」であるから、その範疇で考えるべきである。