2013-04-02 36 views
1

我试图让FactoryGirl中的协会工作,他们只是......不。我已经基本上得到了这个:在FactoryGirl中获得belongs_to协会的权利

class Foo 
    include Mongoid::Document 

    belongs_to :bar 
end 

class Bar 
    include Mongoid::Document 

    has_many :foos 
end 

FactoryGirl.define do 
    factory :foo, class => Foo do 
    bar 
    end 

    factory :bar, class => Bar do 
    end 
end 

至少这样的文档使我相信......但后来在我的测试,我有

a_foo=FactoryGirl.create :foo 
a_foo.bar # Hooray! It's an associated object 
Foo.where(_id: a_foo._id).includes(:bar).first.bar # This is nil! 

为什么是最后一个关联的值为零线?我不需要它,因为被测试的实际代码做了同样的事情,并且它有权期望它能够正常工作......我错过了为什么这种方法无法正常工作?可能是与急切的加载有关吗?

+2

没有'has_one'语句? – apneadiving

+0

我不经常在MongoDB中使用Rails,但我假设Foo.find(id)仍然有效,是吗?如果是这样,当你尝试'Foo.find(a_foo._id).bar'时会发生什么? – Samo

+0

对不起,我编辑了我的帖子以表明真实代码具有'has_many'关系。 @Samo,它是零,就像在我的问题中的代码行... – cbmanica

回答

0

你的代码实际上适用于FactoryGirl 4.2.0,Mongoid 3.0.9。但是当我在禁用身份映射的情况下运行mongoid时(这是默认行为),我遇到了类似的问题。如果没有身份映射表,您可以在数据库中拥有两个不同的ruby对象表示同一个文档,彼此不同步。因此,例如,如果您关闭了autosave,这可能会导致您遇到的问题。

尝试将自己的简化代码粘贴到rails控制台中 - 如果它能正常工作,那么您可能已经在对实际代码进行配对时改变了一些重要内容。 (对不起,指出明显的,但事实上,你的工厂代码中有一个语法错误,使我认为你没有真正测试你的示例代码。)