2012-05-03 11 views
24

Quiero pasar un parámetro a una fábrica que se utilizará para establecer el atributo en un modelo asociado. El modelo asociado se crea dentro de la fábrica.Pase el parámetro en el establecimiento del atributo en la asociación en FactoryGirl

Tengo un modelo de transacción con un enlace de muchos a muchos a través de una tabla de combinación TxLink. Quiero llamar al link = FactoryGirl.create(:link_red_to_sub, sub: 10, red: 7) que creará dos objetos de transacción y un TxLink que vincula los dos.

Aparece un error en la línea de asociación a continuación debido a units: sub al final. El error es "rasgo no definido". Intenté units: { sub } (con corchetes) en su lugar pero no dados.

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 

Respuesta

33

El ayudante association en factory_girl no puede tomar argumentos propiedad dinámica, pero se puede utilizar un atributo dinámico para crear instancias de la asociación que le apetezca:

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 

La única desventaja de esto es que el giver y taker asociaciones utilizarán la estrategia de creación independientemente de la estrategia con la que esté construyendo tx_link, lo que significa esencialmente que attributes_for y build_stubbed no funcionarán correctamente para la fábrica tx_link.

El ejemplo que proporcioné requiere la versión 4.5.0.

+0

ignoran está en desuso. En cambio, deberíamos usar "transitorio" – hcarreras

23

Ampliando la respuesta de Joe para permitir la diferenciación entre construir y crear:

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 
Cuestiones relacionadas