"업데이트된 목록을 전달하는 것"과 "빈 목록을 업로드하는 것"이라는 표현을 보면, users.id 목록을 가지고 rails 콘솔에서 작업하고 계신 것 같습니다.
그렇다면 현재 배지 보유자 목록을 가져와서 제거/부여 작업에서 제외하는 것이 도움이 될 수 있을까요?
(데이터 탐색기 쿼리)
-- [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 내에서 처리할 수 있는 방법이 있을 수도 있지만, 저는 그 부분은 잘 알지 못합니다.)