2012-05-03 32 views
24

我想將參數傳遞到將用於在關聯模型上設置屬性的工廠。相關模型在工廠內創建。在FactoryGirl中關聯設置屬性時傳遞參數

我有一個事務模型,通過一個連接表TxLink與自己建立多對多的鏈接。 我想打電話給link = FactoryGirl.create(:link_red_to_sub, sub: 10, red: 7),它會創建兩個Transaction對象和一個連接這兩個對象的TxLink。

由於末尾有units: sub,我在下面的關聯行中發生錯誤。錯誤是「未定義特徵」。我嘗試units: { sub }(與括號),而不是骰子。

factory :tx_link do 
    units "9.99" 

    factory :link_red_to_sub do 
     ignore do 
     sub 0 
     red 0 
     end 
     units { red } 

     association :giver, factory: :transaction, units: sub 
     association :taker, factory: :redemption, units: red 
    end 
    end 

回答

33

association幫手factory_girl不能採取動態性能參數,但可以使用動態屬性來實例化關聯,但是你想:

factory :tx_link do 
    units "9.99" 

    factory :link_red_to_sub do 
    transient do 
     sub 0 
     red 0 
    end 
    units { red } 

    giver { create(:transaction, units: sub) } 
    taker { create(:redemption, units: red) } 
    end 
end 

的這個唯一的缺點是, givertaker關聯將使用創建策略,無論您正在構建tx_link的哪種策略,這實際上意味着attributes_forbuild_stubbed將無法​​正確工作tx_link工廠。

我提供的示例需要版本4.5.0。

+0

忽略已被棄用。相反,我們應該使用「瞬態」 – hcarreras

23

擴展在喬的回答,讓建設和創造之間的區別:

factory :tx_link do 
    units "9.99" 

    factory :link_red_to_sub do 
    ignore do 
     sub 0 
     red 0 
    end 
    units { red } 

    giver { build(:transaction, units: sub) } 
    taker { build(:redemption, units: red) } 

    after(:create) do |link_red_to_sub| 
     link_red_to_sub.giver.save! 
     link_red_to_sub.taker.save! 
    end 
    end 
end