es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

En Rails 6 y FactoryGirl 4.9, ¿cómo puedo vincular el objeto original de vuelta a su relación has_many que se está creando?

Estoy usando Rails 6 con FactoryGirl 4.9.0. Tengo estos modelos, uno tiene un has_many con el otro…

class Contract < ApplicationRecord
  …
  belongs_to: client

class Client < ApplicationRecord
  …
  has_many: contracts

En mi factory, tengo:

FactoryGirl.define do
  factory: client do
    name "Cliente de prueba”
  end

  factory: dp_client, class: Client do
    Contracts {[create(:contract)]}
  end
end

Pero cuando intento usar la factory,

create: dp_client

Recibo el error…

Validation failed: Client must exist

Cuando creo la relación “has_many” en mi factory, ¿cómo la relaciono con el objeto que la está creando?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El error “Validation failed: Client must exist” indica que el objeto cliente que se está asociando con el objeto contrato no está presente. Para solucionar esto, puede pasar el objeto cliente que necesita ser asociado con el objeto contrato como parámetro al crear el objeto contrato en el factory.

    Aquí está un código actualizado del factory que debería funcionar:

    FactoryGirl.define do
      factory :client do
        name "Test Client"
      end
    
      factory :contract do
        association :client
        # otros atributos de contrato
      end
    
      factory :dp_client, class: Client do
        after(:create) do |client|
          create(:contract, client: client)
        end
      end
    end
    

    En este código actualizado, hemos definido un factory separado para el objeto contrato y lo hemos asociado con el objeto cliente usando el método association. Luego, en el factory dp_client, usamos el callback after(:create) para crear un objeto contrato y asociarlo con el objeto cliente que acababa de crearse.

    Con este código actualizado, llamar a create(:dp_client) debería crear un objeto cliente con un objeto contrato asociado, sin errores de validación.

Comments are closed.