我想将参数传递给工厂,该工厂将用于在关联模型上设置属性。相关模型在工厂内创建。
我有一个Transaction模型,通过连接表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
答案 0 :(得分:34)
factory_girl中的association
帮助程序无法获取动态属性参数,但您可以使用动态属性来实例化关联,但需要:
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
唯一的缺点是,giver
和taker
关联将使用创建策略,无论您构建tx_link
的策略是什么,这实际上意味着{{1 }}和attributes_for
无法正常用于build_stubbed
工厂。
我提供的示例需要4.5.0版。
答案 1 :(得分:24)
扩展Joe的答案,允许区分构建和创建:
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