2010-02-10 91 views
6

这里是我的模型:工厂女孩和HAS_ONE

Class Audition 
    belongs_to :video 
end 

Class Video 
    has_one :audition 
end 

和我的工厂:

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 

我怎么可以创建一个视频工厂有试镜,

我的意思是,能够到:

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

因为我哈已经在我的视频,尝试从视频对象

我试过几件事情,但我总是用栈层次过深或试镜零结束访问试镜的观察员。

你有一个想法?

谢谢, 迈克

回答

7

如果这是我想补充的关联到其他工厂的情形:

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

然后,你可以做

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

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

你也可以当你在测试中创建的工厂需要,即覆盖任何关联关系:

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

希望我说的话是有道理的,是真实的笑。让我们知道您的身体情况如何。

+1

附:我觉得你有堆栈层太深,如果你一些如何告诉有另一种关联这两种模型。 – tsdbrown 2010-02-10 20:54:10

+0

嗯,这正是问题,但我希望与一些有条件的魔法,我可以在两个包括它:-) 您的回复完全有意义, 谢谢, – Mike 2010-02-11 10:29:30

+0

在试图把一个工厂女孩协会我最终放弃了这个协会。只要把这个协会放在“奴隶”模式里面。在我的规格时,我需要创建一个“主”的模式,我还是用“奴隶”的工厂。例如:Factory.create(:slave).master。 – Sam 2010-07-16 08:12:26