Actuellement, la modification en masse des badges tout en les supprimant des détenteurs précédents entraîne la suppression et la réattribution immédiate d’un badge si la personne se trouve à l’intersection des détenteurs précédents et futurs.
Cela entraîne une expérience utilisateur déroutante, car les utilisateurs reçoivent une notification de réception du badge alors que rien n’a changé.
De plus, cela entre en conflit avec l’un de nos cas d’utilisation : nous aimerions supprimer les badges obsolètes et en attribuer de nouveaux en passant la liste mise à jour des détenteurs, tout en conservant inchangés les autres détenteurs et la date d’attribution.
En termes de fonctionnalités, le changement serait une amélioration stricte : en téléchargeant d’abord une liste vide, l’ancien comportement est récupéré.
En parlant de « transmettre la liste mise à jour » et de « télécharger une liste vide », on dirait que vous travaillez dans la console Rails, peut-être avec une liste d’users.id ?
Si c’est le cas, cela pourrait-il vous aider d’obtenir la liste des détenteurs actuels du badge afin de les exclure de vos opérations de retrait/attribution ?
(Requête de l'explorateur de données)
-- [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
Avec cette liste exportée, certaines requêtes et scripts pourraient peut-être :
Trouver l’intersection entre les détenteurs actuels du badge et votre liste de « futurs détenteurs ».
Supprimer les utilisateurs de cette intersection de votre liste de « futurs détenteurs ».
Révoquer le badge de tout utilisateur non inclus dans cette intersection.
Télécharger la liste modifiée des « futurs détenteurs » pour attribuer le badge uniquement aux nouveaux détenteurs.
(Il existe peut-être même un moyen de tout faire dans Rails, mais je ne suis pas très fort de ce côté-là.)