Pase el parámetro al establecer el atributo en la asociación en FactoryGirl

Quiero pasar un parámetro a una fábrica que se usará para establecer el atributo en un modelo asociado. El modelo asociado se crea dentro de la fábrica.

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

Recibo un error en la siguiente línea de asociación debido a la units: sub al final. El error es "rasgo no definido". Lo intenté units: { sub } (con corchetes) en su lugar, pero sin 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

preguntado el 03 de mayo de 12 a las 16:05

2 Respuestas

La association helper en factory_girl no puede tomar argumentos de propiedades dinámicas, pero puede usar un atributo dinámico para instanciar la asociación como desee:

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

El único inconveniente de esto es que el giver y taker las asociaciones usarán la estrategia de creación independientemente de la estrategia que estés construyendo tx_link con, lo que esencialmente significa que attributes_for y build_stubbed no funcionará correctamente para el tx_link fábrica.

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

respondido 04 mar '15, 15:03

ignorar está en desuso. En su lugar, deberíamos usar "transitorio" - hcarreras

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

Respondido 15 ago 13, 22:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.