Иногда мы сталкиваемся с проблемами конкурентности при работе с пользовательскими полями.
Например, обработчик вебхука делает следующее:
user_id = params[:externalUserId].split('-')[1]
user = User.find_by(id: user_id)
raise Discourse::NotFound unless user
... выполняется много обработки ...
user.custom_fields[:myfield] = params[:whatever]
user.save_custom_fields
Когда два вебхука срабатывают в быстрой последовательности для одного и того же пользователя, иногда возникает дублирующая строка. В следующий раз, когда пользовательские поля будут доступны, они будут выглядеть так:
{"myfield"=>["value", "value"]}
Я вижу, что для таблицы user_custom_fields определён индекс по (user_id, name), но он не является уникальным.
Какой паттерн лучше всего применить, чтобы предотвратить это?