Prevent Race Conditions With Retryable In Rails
Wrap .first_or_create!/find_or_create_by! calls in retryable block to prevent race conditions. Use Retryable gem with on: [ActiveRecord::RecordNotUnique, ActiveRecord::RecordInvalid] for a clean solution.
tl;dr Wrap all .first_or_create!/find_or_create_by! calls in retryable block. Retryable.retryable( on: [ActiveRecord::RecordNotUnique, ActiveRecord::RecordInvalid] ) do .. end Discussion Oftentimes in Rails apps we have a situation where only one of something is allowed. A user may be allowed only one profile picture, a question only one answer, only one pinned post etc. In these situations I prefer using the "ensure" pattern with .first_or_create!/find_or_create_by!. There's a gotcha, however. Both of these methods are vulnerable to race conditions, espe...