カスタムフィールドの同時実行性の問題

カスタムフィールドで競合状態の問題が発生することがあります。

例として、次のような処理を行うWebhookハンドラがあります。

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

同じユーザーに対して2つのWebhookが連続して発生すると、重複行が発生することがあります。次にユーザーカスタムフィールドにアクセスすると、次のようになります。
{"myfield"=>["value", "value"]}

(user_id, name)user_custom_fields のインデックスとして定義されていますが、ユニークではないようです。

これを防ぐための最善の方法は何でしょうか?

「いいね!」 4