Comportamiento inconsistente en la clase UserUpdater

@eviltrout

Pasos para reproducir:

  1. Creemos un campo de usuario con el id 1.
  2. Ejecute la segunda línea del código siguiente dos veces.

Caso 1

up = UserUpdater.new(Discourse.system_user, User.find(1))
up.update({:custom_fields=>{:user_field_1=>"abc"}})
  1. Verá abc dos veces al ir a /my/preferences/profile

Sorprendentemente, cuando el perfil se actualiza mediante /my/preferences/profile, funciona perfectamente.

Caso 2

Esto parece funcionar bien

up = UserUpdater.new(Discourse.system_user, User.find(1))
params = ActionController::Parameters.new({:custom_fields=>{:user_field_1=>"abc"}})
up.update(params.permit!)

Lo que ocurre es que, en el Caso 1, el valor se añade a un array y se muestra como valores separados por comas en /my/preferences/profile.

El Caso 2 parece hacer lo correcto, es decir, reemplaza el valor actual con el nuevo, pero envolverlo en ActionController::Parameters no es natural.

Eso parece ser un error válido y debería solucionarse. ¡Gracias por informarlo!

Mi análisis se reduce a lo siguiente.

# caso 1
u1 = User.find(1)
u1.custom_fields[:user_field_1] = "abc"
u1.save

# caso 2
u1.custom_fields["user_field_1"] = "abc"
u1.save

En el caso 1, se crea un nuevo UserCustomField por cada llamada a u1.save.

En el caso 2, todos los UserCustomField con el nombre ‘user_field_1’ se eliminan de la base de datos, excepto el especificado.

Screenshot 2020-08-20 at 11.56.49 AM

En resumen, las versiones con símbolo y cadena de la misma clave se tratan de manera diferente en el mixin HasCustomFields.

Ok, me lancé. Aquí está el PR que soluciona el problema

Ok, así que este ya está fusionado.