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.

Con Rails 6.2, ¿cómo puedo detectar si he pasado un array vacío a mi fábrica?

Estoy utilizando Rails 6.2. Tengo una fábrica de usuarios (FactoryBot 6.2) que configuro así:

FactoryBot.define do
  factory :user do
    ...
    after(:build) do |user, vars|
        ...
      if vars.addresses.nil?
        user.addresses = build_list(:address, 1, user: user)
      end
    end
  end
end

Mi modelo de usuario tiene:

has_many :addresses

Y mi modelo de dirección tiene:

belongs_to :user

El problema con todo lo anterior es que estas llamadas se comportan de la misma manera:

create(:user, addresses: [])

Y

create(:user)

En el primer caso, quiero que se le asigne un array vacío al objeto de usuario. En el segundo caso, me gustaría que las direcciones se creen automáticamente utilizando mi fábrica de direcciones. ¿Cómo puedo distinguir entre pasar un array vacío y no pasar nada en absoluto?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para distinguir entre pasar una matriz vacía y no pasar nada en absoluto, puedes utilizar una declaración condicional en la fábrica de usuarios. Aquí tienes una versión actualizada de la fábrica que debería hacer el truco:

    FactoryBot.define do
      factory :user do
        # ...
        after(:build) do |user, vars|
          if vars.key?(:addresses)
            user.addresses = vars[:addresses]
          else
            user.addresses = build_list(:address, 1, user: user)
          end
        end
      end
    end
    

    En esta versión de la fábrica, estamos comprobando si el hash vars (que contiene cualquier par clave-valor que se haya pasado a create o build) incluye la clave :addresses. Si lo hace, asumimos que se pasó explícitamente una matriz y la asignamos directamente a user.addresses. Si no lo hace, utilizamos build_list para generar una nueva dirección y asignarla a user.addresses.

Comments are closed.