我有2個工廠。 Beta_user和Beta_invite。基本上,在Beta_user可以有效保存之前,我必須創建一個Beta_invite條目。不幸的是,這些模型沒有乾淨的關聯,但他們確實共享一個電子郵件字段。工廠女生依賴工廠
Factory.sequence :email do |n|
"email#{n}@factory.com"
end
#BetaInvite
Factory.define :beta_invite do |f|
f.email {Factory.next(:email)}
f.approved false
f.source "web"
end
#User
Factory.define :user do |f|
f.email {Factory.next(:email)}
f.password "password"
end
#User => BetaUser
Factory.define :beta_user, :parent => :user do |f|
f.after_build do |user|
if BetaInvite.find_by_email(user.email).nil?
Factory(:beta_invite, :email => user.email)
end
end
end
因此,在beta beta_user工廠中,我嘗試使用after_build回調來創建beta_invite工廠。
然而,它似乎是行爲異步或什麼的。可能做了find_by_email取回?
如果我試試這個:
Factory(:beta_user)
Factory(:beta_user)
Factory(:beta_user)
我得到一個失敗,說明沒有與用戶電子郵件beta_invite的記錄。
相反,如果我嘗試:
Factory.build(:beta_user).save
Factory.build(:beta_user).save
Factory.build(:beta_user).save
我得到更好的結果。就好像調用.build方法並等待保存允許創建beta_invite工廠的時間一樣。而不是直接調用Factory.create。該文檔說,在調用Factory.create的情況下,after_build和after_create回調被調用。
任何幫助,非常感謝。
UPDATE:
所以我使用的用戶模型做了before_validation
調用來檢查,如果有一個beta邀請的方法。如果我將此方法調用改爲before_save
。它工作正常。有什麼我在看。 factory_girl何時運行after_build
和after_create
回調與活動記錄的before_validation
和before_save
有關?
您可以發佈您的用戶類?這個錯誤可能在驗證中或者它們是如何設置的。你說他們沒有乾淨的協會也是奇怪的B/C。你究竟是什麼意思?顯示您的模型代碼將有所幫助。 – 2011-05-21 22:28:31