こんな感じで has_one
かつ presence: true
な関連を作りたいとします1:
class A < ApplicationRecord
has_one :b
validates :b, presence: true
end
class B < ApplicationRecord
belongs_to :a
end
この2つのモデル A
B
を factory_bot を使って正しく定義するには以下のように書きます:
FactoryBot.define do
factory 'a' do
after(:build) do |instance|
build('b', a: instance) unless instance.b
end
end
factory 'b' do
association :a, factory: 'a', strategy: :build
after(:build) do |instance|
instance.a&.b = instance
end
end
end
このように書くことで build('a')
build('b')
のどちらも永続化されていない正しい状態の A
と B
インスタンスを生成することができます。
-
「わざわざテーブルを分けるくらいなら、 B の属性を A に含めればいいじゃないか」という指摘もあると思いますが、世の中にはどうしてもこうせざるを得ない状況というのも存在するのです。 ↩