Factory Girl:自动分配父对象

9
我正在了解Factory Girl,但遇到了一个似乎应该很容易解决的问题。我无法将文档转化为工作示例。
假设我有以下模型:
class League < ActiveRecord::Base
   has_many :teams
end

class Team < ActiveRecord::Base
   belongs_to :league
   has_many :players
end

class Player < ActiveRecord::Base
   belongs_to :team
end

我想做的是这件事:
team = Factory.build(:team_with_players)

并让它为我积累一堆玩家。我尝试过这个:
Factory.define :team_with_players, :class => :team do |t|
   t.sequence {|n| "team-#{n}" }
   t.players {|p| 
       25.times {Factory.build(:player, :team => t)}
   }
end

但在:team=>t部分中失败,因为t并不是真正的Team,它是一个Factory :: Proxy :: Builder。我必须给球员分配一个团队。

在某些情况下,我想建立一个League,让它做类似的事情,创建多个有多个球员的团队。

我错过了什么?


我刚遇到了完全相同的问题(相同的错误),四处查找但没有找到解决方案。 - Daniel Beardsley
2个回答

5
Factory.define :team do |team|
  team.sequence(:caption) {|n| "Team #{n}" }
end

Factory.define :player do |player|
  player.sequence(:name) {|n| "John Doe #{n}" }
  player.team = nil
end

Factory.define :team_with_players, :parent => :team do |team|
  team.after_create { |t| 25.times { Factory.build(:player, :team => t) } }
end

2
这个怎么样:
Factory.define :team_with_players, :class => :team do |t|
  t.sequence { |n| "team-#{n}" }
  t.players do |team| 
    25.times.collect { |n| team.association(:player) }
  end
end

但是如果玩家需要一个关于团队的引用,我该从哪里获取?在这个例子中,“team”指的是一个工厂对象... - Ben Scheirman
我有类似这样的东西:team.association(:player, :team_id => team) 看起来很奇怪,但对我有效。 - Priit
1
当我这样做时,它会抱怨:“期望Team,但实际是FactoryGirl :: Proxy”或类似的东西。 - Ben Scheirman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接