Actualmente, la edición masiva de insignias mientras se eliminan de los poseedores anteriores da como resultado que a las personas se les quite una insignia y se les vuelva a otorgar inmediatamente, si están en la intersección de los poseedores anteriores y futuros.
Esto resulta en una experiencia de usuario confusa, ya que los usuarios reciben una notificación sobre la recepción de la insignia a pesar de que nada ha cambiado.
Además, entra en conflicto con uno de nuestros casos de uso: nos gustaría eliminar insignias obsoletas y otorgar otras nuevas pasando la lista actualizada de poseedores, mientras se mantienen sin cambios los otros poseedores y la fecha de otorgamiento.
En cuanto a las funcionalidades, el cambio sería una mejora estricta: al subir una lista vacía primero, se recupera el comportamiento anterior.
Al hablar de “pasar la lista actualizada” y “subir una lista vacía”, parece que estás trabajando en la consola de Rails, quizás con una lista de users.id.
Si es así, ¿podría ser útil obtener la lista de los actuales titulares de la insignia para poder excluirlos de tus operaciones de eliminación o concesión?
(Consulta del explorador de datos)
-- [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
Con esa lista exportada, algunas consultas y scripts podrían:
Encontrar la intersección entre los titulares actuales de la insignia y tu lista de “futuros titulares”.
Eliminar esos usuarios de la intersección de tu lista de “futuros titulares”.
Revocar la insignia de cualquier usuario que no esté en la intersección.
Subir la lista editada de “futuros titulares” para otorgar la insignia solo a los nuevos titulares.
(Tal vez incluso exista una forma de hacerlo todo dentro de Rails, pero no soy muy fuerte en eso.)