我有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回调被调用.
任何帮助深表感谢.
更新:
所以我使用的用户模型对该方法进行了before_validation调用,该方法检查是否有beta邀请.如果我将此方法调用转换为before_save.它正常工作.有什么我在看吗factory_girl什么时候运行与active-record的before_validation和before_save相关的after_build和after_create回调?