2010-01-13 124 views
6

我有一個問題,我有一個父母模型Foo,這兩個has_many :barshas_many :bazes。最後,我還有一個加入模型BarBaz其中belongs_to :barbelongs_to :baz。我想驗證所有bar_bazes,以便它的bar和baz都屬於同一個foo。但我似乎無法找到一種方法來爲這個模型定義一個有效的工廠。factory_girl關聯驗證

Factory.define(:bar) do |bar| 
    bar.association(:foo) 
end 

Factory.define(:baz) do |baz| 
    bar.association(:foo) 
end 

Factory.define(:bar_baz) do |bar_baz| 
    baz_bar.association(:foo) 
    baz_bar.association(:bar) 
    baz_bar.association(:baz) 
end 

我得到一個無效的記錄錯誤,當我嘗試創建後者,因爲酒吧和巴茲factory_girl嘗試關聯它每個人都有自己富。我擰了嗎?

回答

5

因此,經過幾個小時的打擊我的頭反對這個問題,我想我終於有一個解決方案。雖然這很瘋狂,所以希望其他人仍然可以告訴我我愚蠢的地方。

Factory.define :foo do |foo| 
end 

Factory.define :bar do |bar| 
end 

Factory.define :baz do |baz| 
end 

Factory.define :foo_with_baz do |foo| 
    foo.after_create { |foo| Factory(:baz, :foo => foo) } 
end 

Factory.define :bar_baz do |bar_baz| 
    bar_baz.bar {|bar| bar.association(:bar, :foo => Factory(:foo_with_baz)) 
    bar_baz.after_build {| bar_baz| bar_baz.baz_id = bar_baz.foo.bars.first.id } 
end 

的關鍵問題是,有需要在數據庫中的FOO已經可以在通過工廠獨自一人的,因爲你可以在factories.rb使用局部變量或任意Ruby代碼(據我可以告訴)。

+0

這是非常令人印象深刻的工作。偉大的工作 – Trip 2010-09-20 23:55:08

+0

好吧,它不可能那麼偉大,因爲在幾個月後回到它之後,我不記得我到底在做什麼。 :) – tfwright 2010-09-21 17:19:34

0

創建深度嵌套關聯的工廠的瘋狂使我創建了fixie,它允許您使用ActiveRecord創建測試記錄。它在db:test:prepare步驟中運行。我用它來消除對燈具的需求。您可以繼續使用工廠來生成更容易構建的對象。

+0

我真的很喜歡這一點,但爲什麼我們不能讓我們的工廠解決方案允許在工廠定義中的任意Ruby代碼? – tfwright 2010-01-15 05:00:39

+0

你可以在一定程度上。你需要解決的技巧是多次調用工廠,並且每次都需要生成一個有效的對象。這與協會混亂。 – 2010-01-15 21:40:03