В настоящее время при массовом редактировании значков с их удалением у предыдущих владельцев пользователи, входящие в пересечение предыдущих и будущих владельцев, теряют значок и сразу же получают его обратно.
Это приводит к запутанному пользовательскому опыту: пользователи получают уведомление о получении значка, хотя фактически ничего не изменилось.
Кроме того, это противоречит одному из наших сценариев использования: мы хотим удалять устаревшие значки и присваивать новые, передавая обновлённый список владельцев, при этом сохраняя остальных владельцев и дату присвоения без изменений.
С точки зрения функциональности это изменение является строгим улучшением: загрузив сначала пустой список, можно восстановить старое поведение.
По фразам «передача обновлённого списка» и «загрузка пустого списка» складывается впечатление, что вы работаете в консоли Rails, возможно, со списком users.id?
Если это так, может ли помочь получение списка текущих обладателей значков, чтобы вы могли исключить их из операций по снятию или присвоению?
(Запрос к исследованию данных)
-- [params]
-- badge_id :badge
SELECT
u.id AS user_id
FROM user_badges ub
JOIN users u ON u.id = ub.user_id
JOIN badges b ON b.id = ub.badge_id
WHERE ub.badge_id = :badge
С помощью этого экспортированного списка, возможно, некоторые запросы и скрипты смогут:
Найти пересечение текущих обладателей значков и вашего списка «будущих обладателей».
Исключить пользователей из этого пересечения из вашего списка «будущих обладателей».
Отозвать значок у всех пользователей, которые не входят в это пересечение.
Загрузить отредактированный список «будущих обладателей», чтобы присвоить значок только новым обладателям.
(Возможно, даже существует способ сделать всё это непосредственно в Rails, но я не силён в этом.)