Currently, mass editing badges while removing them from previous holders results in people getting a badge removed and immediately regranted, if they are in the intersection of previous and future holders.
This results in a confusing user experience, as users receive a notification about receiving the badge even though nothing has changed.
Also, it clashes with one of our use cases: We would like to drop obsolete badges and award new ones by passing the updated list of holders, while keeping the other holders and the date of awarding unchanged.
Feature-wise, change would be is a strict improvement: By uploading an empty list first, the old behavior is recovered.
По фразам «передача обновлённого списка» и «загрузка пустого списка» складывается впечатление, что вы работаете в консоли 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, но я не силён в этом.)