Мне пришлось столкнуться с подобной проблемой.В нашем бэкэнде пользователь создается из токена, если пользователь не существует.ПОСЛЕ ТОГО, КАК пользовательская запись уже создана, отправляется медленный вызов API для обновления информации о пользователях.
def self.find_or_create_by_facebook_id(facebook_id)
User.find_by_facebook_id(facebook_id) || User.create(facebook_id: facebook_id)
rescue ActiveRecord::RecordNotUnique => e
User.find_by_facebook_id(facebook_id)
end
def self.find_by_token(token)
facebook_id = get_facebook_id_from_token(token)
user = User.find_or_create_by_facebook_id(facebook_id)
if user.unregistered?
user.update_profile_from_facebook
user.mark_as_registered
user.save
end
return user
end
Шаг стратегии состоит в том, чтобы сначала удалить медленный вызов API (в моем случае update_profile_from_facebook) изсоздать метод.Поскольку операция занимает так много времени, вы значительно увеличиваете вероятность дублирования операций вставки, когда вы включаете операцию как часть вызова для создания.
Второй шаг - добавить уникальное ограничение для столбца базы данных вубедитесь, что дубликаты не созданы.
Последний шаг - создание функции, которая будет перехватывать исключение RecordNotUnique в редком случае, когда дубликаты операций вставки отправляются в базу данных.
Это может небыть самым элегантным решением, но оно сработало для нас.