shimgo
5/22/2017 - 3:25 PM

FactoryGirlでbelongs_toである子オブジェクトが異なる親オブジェクト間で共有されてしまう

FactoryGirlでbelongs_toである子オブジェクトが異なる親オブジェクト間で共有されてしまう

以下のようにデフォルトの属性値に関する記述がないファクトリだと異なる親で生成したオブジェクトが共有されてしまう。

FactoryGirl.define do
  factory :guest_user do
    trait :with_user do
      user
    end
  end
end
a = FactoryGirl.create(:user, :with_guest_user)
a.id #=> 1
a.guest_user.id #=> 1
a.guest_user.user_id #=> 1
b = FactoryGirl.create(:user, :with_guest_user)
b.id #=> 2
b.guest_user.id #=> 1
b.guest_user.user_id #=> 2
a.guest_user.user_id #=> 2 ←!!

以下のようにbuild後にセットすればcreate後も別々のオブジェクトになる。
ただ、上記のようにuserで他のファクトリを指定するとGuestUserをbuildしてもUserはcreateされているので、そもそもcreateをするのが普通でbuildを使っていくことは少ないのか?

FactoryGirl.define do
  factory :guest_user do
    trait :with_user do
      after :build do |guest_user|
        guest_user.user = FactoryGirl.build(:user)
      end
    end
  end
end