2010-02-10 18 views
6

Aquí están mis modelos:Factory Girl y has_one

Class Audition 
    belongs_to :video 
end 

Class Video 
    has_one :audition 
end 

y mis fábricas:

Factory.define :video do |v| 
    v.filename {Sham.filename} 
    v.video_url {Sham.url} 
end 

Factory.define :audition do |a| 
    a.video  {|a| a.association(:video)} 
    a.label  {Sham.label} 
end 

¿Cómo podría crear una fábrica de vídeo que tiene una audición,

Es decir, ser capaces a:

v = Factory.create(:video) 
v.audition # I'd like this to be not nil ! 

Porque tengo Tengo un observador en mi video que intenta acceder a la audición desde el objeto de video

Intenté varias cosas, pero siempre termino con un nivel de pila demasiado profundo o audición nula.

¿Tienes una idea?

Gracias, Mike

Respuesta

7

Si ese es el caso, yo añadiría la asociación en la otra fábrica:

Factory.define :video do |v| 
    v.filename      {Sham.filename} 
    v.video_url      {Sham.url} 
    v.audition      {|v| v.association(:audition)} 
end 

A continuación, puede hacer

v = Factory(:video) # This will now have an audition 
a = v.audition # This should not be nil 

y

a = Factory(:audition) # An audition without a video, if that's possible? 

También puede anular cualquier forma de asociación, según sea necesario cuando se crea la fábrica en sus pruebas, es decir:

v = Factory(:video, :audition => Factory(:audition)) 
v = Factory(:video, :audition => nil) 

esperanza lo que he dicho tiene sentido y es cierto lol. Háganos saber cómo le va.

+1

P.s. Creo que obtienes un nivel de pila demasiado profundo si de alguna manera les cuentas a los dos modelos que tienen una asociación con el otro. – tsdbrown

+0

hmm ese es exactamente el problema, pero esperaba con algo de magia condicional que podría incluirlo en ambos :-) Tu respuesta tiene sentido, Gracias, – Mike

+0

Después de estar atascado tratando de poner una asociación de chicas de fábrica en ambos lados de la asociación finalmente me di por vencida. Y simplemente ponga la asociación dentro del modelo "esclavo". En mis especificaciones cuando necesito crear un modelo "maestro", sigo usando la fábrica "esclava". Por ejemplo: Factory.create (: slave) .master. – Sam

Cuestiones relacionadas