31

我想将一个参数传递给一个工厂,该工厂将用于设置关联模型的属性。关联模型是在工厂内创建的。

我有一个事务模型,它通过连接表 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
4

2 回答 2

39

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

唯一的缺点是giverandtaker关联将使用 create 策略,无论您使用什么策略构建,tx_link这基本上意味着工厂无法正常工作。attributes_forbuild_stubbedtx_link

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

于 2012-05-04T17:34:05.083 回答
26

扩展乔的答案以允许区分构建和创建:

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
于 2013-08-15T21:09:14.730 回答