2012-05-03 12 views
24

Chcę przekazać parametr do fabryki, która będzie używana do ustawiania atrybutu w skojarzonym modelu. Powiązany model jest tworzony w fabryce.Przekaż parametr w atrybucie ustawień na powiązanie w FactoryGirl

Mam model transakcji z łączem wiele do wielu do siebie poprzez tabelę łączenia TxLink. Chcę zadzwonić pod numer link = FactoryGirl.create(:link_red_to_sub, sub: 10, red: 7), który utworzy dwa obiekty Transakcji i TxLink, który łączy te dwa.

Pojawia się błąd w poniższym wierszu asocjacyjnym z powodu units: sub na końcu. Błąd to "cecha nie zdefiniowana". Spróbowałem zamiast tego units: { sub } (z nawiasami), ale bez kości.

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 

Odpowiedz

33

association pomocnik w factory_girl nie może podjąć dynamiczne argumentów rzeczowych, ale można użyć atrybutu dynamicznego tworzenia wystąpienia stowarzyszenie jednak chcesz:

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 

Jedynym minusem jest to, że giver i taker stowarzyszenia będą używać strategii tworzenia niezależnie od strategii, którą budujesz, tx_link z, co w zasadzie oznacza, że ​​attributes_for i build_stubbed nie będą działać poprawnie dla fabryki tx_link.

Podany przeze mnie przykład wymaga wersji 4.5.0.

+0

ignorować jest przestarzała. Zamiast tego powinniśmy użyć "przejściowego" – hcarreras

23

Rozwijając na odpowiedź Joe, aby umożliwić odróżnienie kompilacji i tworzyć:

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 
Powiązane problemy