2012-05-03 36 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