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?