Custom_fields aggiornato, il valore si trasforma simultaneamente in array.

Questo bug sembra essere stato risolto qualche tempo fa, come indicato in questo post: Custom_fields simultaneous save with json becomes an array

Purtroppo, ora sto affrontando il problema di più endpoint chiamati contemporaneamente che aggiornano i custom_fields dell’utente allo stesso tempo, facendo sì che i valori impostati da me come :text diventino array.

3 endpoint chiamati e impostazione di custom_field come array invece che come stringa

Qualche aiuto? Questo blocca l’intero progetto in questo momento…

Sto riscontrando questo problema nella versione 2.5.0.beta7 in ambiente di sviluppo locale.

Esiste un modo per impostare un lock sul database fino a quando i valori non vengono salvati, in questa situazione?

Potrebbe essere il problema che sto riscontrando? Differences between transactions and locking - makandra dev

Tieni presente che quando due transazioni vengono eseguite contemporaneamente in due thread, ciascun thread non vede le modifiche dell’altra transazione finché non vengono confermate con successo. Tuttavia, vede le proprie modifiche (questa è una spiegazione semplificata; la realtà è molto più complessa).

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

Mostra valori normali, il che mi fa pensare che siano state create più righe.

Questo avrebbe dovuto risolvere il problema. Era un bug di vecchia data.

Sì, l’ho visto :frowning:

Purtroppo ora mi trovo a dover aggiornare dati sensibili potenzialmente nello stesso momento. Penso che questo accada perché lo sto facendo tramite endpoint, ma è l’unico modo in cui posso procedere e non ho il controllo sulle chiamate. Potrebbe essere una sola chiamata o anche dieci.

Posso provare a ridurre il numero di chiamate dall’app e inviare alcuni dati in blocco, ma il problema è che ci sono due fonti per le chiamate: dispositivi mobili e servizi esterni.

Sono coinvolti dati relativi ai pagamenti :frowning:

Questo sembra essere il comportamento esistente dei campi personalizzati e non un regression. Ci sono diversi modi per risolverlo:

  1. Puoi aggiungere un indice unico sul campo personalizzato (name, user_id)
  2. Puoi circondare il tuo codice con un DistributedMutex
  3. Puoi utilizzare un design basato su tabelle invece che sui campi personalizzati

qualcosa del genere? Sembra funzionare.

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

Inoltre, cambierò la logica per eseguire le chiamate una alla volta invece che tutte insieme, sperando di prevenire eventuali problemi.

Grazie a tutti @eviltrout @fzngagan