Problema di concorrenza dei campi personalizzati

A volte ci imbattiamo in problemi di concorrenza con i campi personalizzati.

Un esempio è un gestore di webhook che fa questo

user_id = params[:externalUserId].split('-')[1]
user = User.find_by(id: user_id)
raise Discourse::NotFound unless user

... fare un sacco di elaborazione ...

user.custom_fields[:myfield] = params[:whatever]
user.save_custom_fields

Quando due webhook vengono attivati in rapida successione per lo stesso utente, a volte finiamo con una riga duplicata. La prossima volta che si accede ai campi personalizzati dell’utente, essi appaiono come
{"myfield"=>["value", "value"]}

Vedo che (user_id, name) è definito come un indice ma non univoco su user_custom_fields.

Quale sarebbe il modello migliore per evitare che ciò accada?

4 Mi Piace