Custom_fields actualizado: el valor se convierte simultáneamente en un array.

Este error parece haberse solucionado hace un tiempo en este tema: Custom_fields simultaneous save with json becomes an array

Desafortunadamente, ahora estoy lidiando con llamadas simultáneas a varios endpoints que actualizan los custom_fields del usuario al mismo tiempo, lo que hace que los valores que establezco como :text se conviertan en arrays.

3 endpoints llamados y estableciendo custom_field como array en lugar de string

¿Alguna ayuda? Esto está bloqueando todo mi proyecto en este momento…

Estoy encontrando este problema en la versión 2.5.0.beta7 en desarrollo local.

¿Existe alguna forma de poder establecer un bloqueo en la base de datos hasta que los valores se guarden, en esta situación?

1 me gusta

¿Podría este ser el problema que estoy enfrentando? Differences between transactions and locking - makandra dev

Tenga en cuenta que cuando dos transacciones se ejecutan de forma concurrente en dos hilos, cada hilo no ve los cambios de la otra transacción hasta que se confirman correctamente. Sin embargo, sí ve sus propios cambios (esta es una explicación simplificada; la realidad es mucho más compleja).

1 me gusta

def self.cast_custom_field(key, value, types, return_array = true)

Muestra valores normales, lo que me hace pensar que se crearon varias filas.

2 Me gusta

Esto debería haberlo solucionado. Era un error de larga data.

2 Me gusta

Sí, lo vi :frowning:

Lamentablemente, ahora me enfrento a la posibilidad de actualizar datos sensibles al mismo tiempo. Creo que esto ocurre porque lo estoy haciendo a través de endpoints, pero es la única forma en que puedo hacerlo y no tengo control sobre las llamadas. Puede ser una llamada o diez.

Puedo intentar minimizar las llamadas desde la aplicación y enviar algunos datos en lotes, pero el problema es que hay dos fuentes para las llamadas: dispositivos móviles y servicios externos.

Se trata de datos de pago :frowning:

1 me gusta

Esto suena como el comportamiento existente de los campos personalizados y no como una regresión. Hay varias formas de solucionarlo:

  1. Puedes agregar un índice único en el campo personalizado (name, user_id).
  2. Puedes rodear tu código con un DistributedMutex.
  3. Puedes utilizar un diseño de tabla en lugar de campos personalizados.
3 Me gusta

¿Algo así? Parece que funciona.

DistributedMutex.synchronize("user_data_update_#{user.id}") do
    user.save_custom_fields(true)
end
1 me gusta

Además, cambiaré la lógica para ejecutar las llamadas una por una en lugar de todas a la vez, con la esperanza de evitar cualquier problema.

Gracias, chicos @eviltrout @fzngagan

4 Me gusta