Problema de concurrencia en campos personalizados

A veces nos encontramos con problemas de concurrencia con campos personalizados.

Un ejemplo es un manejador de webhooks que hace esto

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

... hacer mucho procesamiento ...

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

Cuando dos webhooks se activan en rápida sucesión para el mismo usuario, a veces terminamos con una fila duplicada. La próxima vez que se accede a los campos personalizados del usuario, se ven así
{"myfield"=>["value", "value"]}

Veo que (user_id, name) está definido como un índice pero no es único en user_custom_fields.

¿Cuál sería el mejor patrón para evitar que esto suceda?

4 Me gusta