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?
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:
En esta versión de la fábrica, estamos comprobando si el hash
vars
(que contiene cualquier par clave-valor que se haya pasado acreate
obuild
) incluye la clave:addresses
. Si lo hace, asumimos que se pasó explícitamente una matriz y la asignamos directamente auser.addresses
. Si no lo hace, utilizamosbuild_list
para generar una nueva dirección y asignarla auser.addresses
.