2010-03-02 14 views
9

Me estoy metiendo en Factory Girl y me encuentro con una dificultad que estoy segura debería ser mucho más fácil. Simplemente no pude convertir la documentación en un ejemplo de trabajo.Factory Girl: Asignación automática de objetos principales

Supongamos que tengo los siguientes modelos:

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 

Lo que quiero hacer es lo siguiente:

team = Factory.build(:team_with_players) 

y hacer que se acumule un montón de jugadores para mí. He intentado esto:

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 

Pero esto no funciona en la sección de :team=>t, porque t no es realmente una Team, es una Factory::Proxy::Builder. I tiene para tener un equipo asignado a un jugador.

En algunos casos quiero construir un League y hacer que haga algo similar, creando múltiples equipos con múltiples jugadores.

¿Qué me estoy perdiendo?

+0

Me acabo de encontrar con este mismo problema exacto (mismo error) y miraron a su alrededor y no han encontrado una solución. –

Respuesta

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

¿Qué tal esto:

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 
+0

Pero si el jugador necesita una referencia para el equipo, ¿de dónde lo saco? En este ejemplo, "equipo" se refiere a un objeto de fábrica ... –

+0

Tengo algo similar a esto: team.association (: player,: team_id => equipo) parece extraño pero funciona para mí. – Priit

+1

cuando lo hago, se queja: "Equipo esperado, pero era FactoryGirl :: Proxy" o algo así. –

Cuestiones relacionadas