2010-02-10 7 views
6

Voici mes modèles:Factory Girl et has_one

Class Audition 
    belongs_to :video 
end 

Class Video 
    has_one :audition 
end 

et mes usines:

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 

Comment pourrais-je créer une usine de vidéo qui ont une audition,

Je veux dire, pouvoir à:

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

Parce que je ha J'ai un observateur sur ma vidéo qui essaye d'accéder à l'audition de l'objet vidéo

J'ai essayé plusieurs choses mais je finis toujours avec un niveau de pile trop profond ou auditionne à zéro.

Avez-vous une idée?

Merci, Mike

Répondre

7

Si tel est le cas, je voudrais ajouter l'association dans l'autre usine:

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

Ensuite, vous pouvez faire

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

et

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

Vous pouvez également remplacer toute association au besoin lors de la création de l'usine dans vos tests, i.e.:

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

espoir que je l'ai dit est logique et est vrai lol. Fais nous savoir comment tu reussis.

+1

P.s. Je pense que vous avez un niveau de pile trop profond si vous connaissez les deux modèles qui ont une association avec l'autre. – tsdbrown

+0

hmm c'est exactement le problème mais j'espérais avec un peu de magie conditionnelle je pourrais l'inclure dans les deux :-) Votre réponse est tout à fait logique, Merci, – Mike

+0

Après avoir été bloqué avec essayer de mettre une association d'usine fille des deux côtés de l'association que j'ai finalement abandonnée. Et mettez simplement l'association dans le modèle "esclave". Dans mes spécifications quand j'ai besoin de créer un modèle "maître", j'utilise toujours l'usine "esclave". Par exemple: Factory.create (: slave) .master. – Sam

Questions connexes