Подтвердить что ты не робот

Параметр Pass в атрибуте настройки при ассоциации в FactoryGirl

Я хочу передать параметр в factory, который будет использоваться для установки атрибута в связанной модели. Связанная модель создается в factory.

У меня есть модель транзакции со ссылкой "многие-ко-многим" с помощью таблицы соединений 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
4b9b3361

Ответ 1

Помощник 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

Единственным недостатком этого является то, что ассоциации giver и taker будут использовать стратегию создания независимо от стратегии, с которой вы строите tx_link с, что по сути означает, что attributes_for и build_stubbed won ' t работает правильно для tx_link factory.

В приведенном ниже примере требуется версия 4.5.0.

Ответ 2

Развернувшись на Joe, чтобы разрешить разграничение между сборкой и create:

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