Пропустить неизменённых пользователей при массовом редактировании значков

В настоящее время при массовом редактировании значков с их удалением у предыдущих владельцев пользователи, входящие в пересечение предыдущих и будущих владельцев, теряют значок и сразу же получают его обратно.

Это приводит к запутанному пользовательскому опыту: пользователи получают уведомление о получении значка, хотя фактически ничего не изменилось.

Кроме того, это противоречит одному из наших сценариев использования: мы хотим удалять устаревшие значки и присваивать новые, передавая обновлённый список владельцев, при этом сохраняя остальных владельцев и дату присвоения без изменений.

С точки зрения функциональности это изменение является строгим улучшением: загрузив сначала пустой список, можно восстановить старое поведение.

1 лайк

По фразам «передача обновлённого списка» и «загрузка пустого списка» складывается впечатление, что вы работаете в консоли 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

С помощью этого экспортированного списка, возможно, некоторые запросы и скрипты смогут:

  1. Найти пересечение текущих обладателей значков и вашего списка «будущих обладателей».
  2. Исключить пользователей из этого пересечения из вашего списка «будущих обладателей».
  3. Отозвать значок у всех пользователей, которые не входят в это пересечение.
  4. Загрузить отредактированный список «будущих обладателей», чтобы присвоить значок только новым обладателям.

(Возможно, даже существует способ сделать всё это непосредственно в Rails, но я не силён в этом.)

Нет? В интерфейсе управления значками есть форма массовой выдачи наград, которой я пользуюсь.

Ой, это немного неловко, я пропустил добавление массовых наград.

Может быть, ваша функция стала бы еще одним вариантом при загрузке, что-то вроде этого?

1 лайк