问题描述
||
我正在使用factory_girl_rails而不是装置。这是我的模型:
class User < ActiveRecord::Base
has_many :tasks
end
class Task < ActiveRecord::Base
belongs_to :user
end
这是我的工厂:
Factory.define :user do |u|
end
Factory.define :task do |t|
t.association :user,:factory => :user
end
在测试中,我这样做:
user = Factory.create :user
(1..5).each { Factory.create(:task,:user => user)}
我遇到的问题是,之后的user.tasks
仅包含一项任务。
我尝试过这样定义“ 4”工厂:
Factory.define :user do |u|
u.tasks {|tasks| [tasks.association(:user)] }
end
像这样:
Factory.define :user do |u|
u.tasks {|tasks| [tasks.association(:user),tasks.association(:user)] }
end
在这两种情况下,ѭ7都会导致无限循环。
解决方法
我认为您正在做的事情是倒退的-您可以从用户创建任务,但反之则不然,就像您尝试做的一样。从概念上讲,关联从用户到任务。
我所做的就是为该类型的用户创建一个特殊的工厂。
Factory.define :user_with_tasks,:parent => :user do |user|
user.after_create {|u| 5.times { Factory.create(:task,:user => user) } }
end
另外,如果您只想使用默认工厂,则只需执行此操作
Factory.define :task do |f|
f.user :user
end
无需指定工厂
更新:看起来其他人过去做过类似的事情:
在factory_girl中与孩子们建立联系
, 嗯,这行得通:
Factory.define :task do |t|
t.association :user
t.after_create {|t| t.user.tasks << t}
end
约翰,您的方法可行,但实际上我无法使用您所描述的内容,因为在测试中,任务还需要引用另一个(未提及的)模型,并且在user_with_tasks
工厂定义中我看不到引用它的方法。