我有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