2013-04-02 66 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控制檯中 - 如果它能正常工作,那麼您可能已經在對實際代碼進行配對時改變了一些重要內容。 (對不起,指出明顯的,但事實上,你的工廠代碼中有一個語法錯誤,使我認爲你沒有真正測試你的示例代碼。)