Factory Girl: автоматическое назначение родительских объектов - PullRequest
9 голосов
/ 02 марта 2010

Я только начинаю играть в 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 и заставить его делать то же самое, создавая несколько команд с несколькими игроками.

Чего мне не хватает?

Ответы [ 2 ]

5 голосов
/ 17 марта 2010
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 голосов
/ 03 марта 2010

Как насчет этого:

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
...