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

Единственный недостаток этого является то, что giver и taker ассоциации будут использовать стратегию создания независимо от стратегии, которую вы строите tx_link, что по существу означает, что attributes_for и build_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 
Смежные вопросы