Описание: Пользователь попросил отозвать у него значок «Первый лайк» после того, как он сам отменил лайк под постом, но значок продолжал автоматически присваиваться снова. Контекст можно найти в моем предыдущем посте в категории поддержки.
Шаги для воспроизведения:
- Создайте нового пользователя
- Поставьте лайк под постом
- Получите значок «Первый лайк»
- Отмените лайк под постом
- Переключитесь на пользователя с правами администратора
- Перейдите в панель администратора для пользователя, поставившего лайк под постом
- Откройте опцию «Редактировать значки»
- Нажмите «Отозвать» на значке «Первый лайк»
- Подождите некоторое время (я не уверен, когда запускается фоновая задача для этого конкретного значка, но день точно хватит. Возможно, стоит попробовать запустить все задачи, связанные со значками, в Sidekiq, чтобы ускорить процесс?)
- Значок автоматически присваивается пользователю снова, за тот же пост, под которым лайк был отменен, и на ту же дату, когда лайк был поставлен
Я сузил проблему до этой строки SQL-запроса для присвоения значка, поскольку, хотя строка в таблице post_actions для действия «лайк» всё ещё существует после отмены лайка, у неё столбец deleted_at установлен в значение даты, которое запрос не учитывает. Я считаю, что исправление этой проблемы потребует изменения условия WHERE в подзапросе на:
WHERE post_action_type_id = 2 AND
pa.deleted_at IS NULL AND
(:backfill OR pa.post_id IN (:post_ids) )
но у меня нет настроенной среды разработки или много времени, чтобы протестировать это исправление самостоятельно.
Приоритет/Серьезность: Я уже решил эту проблему для себя, удалив соответствующие строки в post_actions, и ранее мне никогда не поступали подобные запросы. Думаю, это не делает задачу очень приоритетной?