Problème de concurrence des champs personnalisés

Il nous arrive parfois de rencontrer des problèmes de concurrence avec des champs personnalisés.

Voici un exemple avec un gestionnaire de webhook qui fait ceci :

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

... faire beaucoup de traitement ...

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

Lorsque deux webhooks se déclenchent rapidement pour le même utilisateur, nous nous retrouvons parfois avec une ligne en double. La prochaine fois que les champs personnalisés de l’utilisateur sont accédés, ils ressemblent à ceci :
{"myfield"=>["value", "value"]}

Je vois que (user_id, name) est défini comme un index mais pas comme unique sur user_custom_fields.

Quelle serait la meilleure approche pour éviter que cela ne se produise ?

4 « J'aime »