在FactoryGirl中的关联设置属性中传递参数

rig*_*gyt 29 rspec ruby-on-rails ruby-on-rails-3 factory-bot

我想将参数传递给工厂,该工厂将用于在关联模型上设置属性.相关模型在工厂内创建.

我有一个事务模型,通过连接表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
Run Code Online (Sandbox Code Playgroud)

Joe*_*ris 37

associationfactory_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
Run Code Online (Sandbox Code Playgroud)

唯一的缺点是,无论您正在构建什么策略giver,taker协会都将使用创建策略tx_link,这实际上意味着attributes_for并且build_stubbed不会对tx_link工厂正常工作.

我提供的示例需要4.5.0版.


BKe*_*ewl 26

扩展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
Run Code Online (Sandbox Code Playgroud)