Factory Girl docs提供了这种语法来创建(我猜)父子关联......
Factory.define :post do |p|
p.author {|a| a.association(:user) }
end
帖子属于用户(其“作者”)。
如果要定义工厂来创建User
s,它有一堆Post
s怎么办?
或者,如果它是多对多的情况(例如,请参阅下面的更新)?
更新
我以为我已经弄明白了。我试过这个......
Factory.define(:user) do |f|
f.username { Factory.next(:username) }
# ...
f.roles { |user|
[
Factory(:role),
Factory(:role, {:name => 'EDIT_STAFF_DATA'})
]
}
end
它似乎最初起作用,但后来我得到了验证错误,因为F.G.我试图用相同的用户名和电子邮件两次保存用户。
所以我回到原来的问题。如果您有多对多关系,例如说Users
和Roles
,那么如何定义一个将Users
与某些关联Roles
一起返回的工厂?请注意Roles
必须是唯一的,所以我不能拥有F.G.每次创建Role
时,都会在数据库中创建一个新的“ADMIN”User
。
答案 0 :(得分:5)
我不确定这是否是最正确的方法,但它确实有效。
Factory.define(:user) do |u|
u.login 'my_login'
u.password 'test'
u.password_confirmation 'test'
u.roles {|user| [user.association(:admin_role),
user.association(:owner_role, :authorizable_type => 'User', :authorizable_id => u.id) ]}
end
答案 1 :(得分:4)
答案 2 :(得分:1)
最近的update to factory girl允许使用回调块指定关联
答案 3 :(得分:1)
我创建了一个active_factory plugin,它可以像这样处理你的情况:
models { user - posts(3) }
如果有兴趣,我可以尝试与factory_girl工厂建立集成。