Получено несколько сообщений от пользователей о значке «Посвящённый», который можно получить после 365 дней непрерывного входа в систему. Проблема, похоже, заключается в том, что пользователям из часовых поясов, сильно отличающихся от UTC (например, PST +8), необходимо учитывать, что «день» в системе определяется по времени UTC. Мы видим, что европейские пользователи получают значок, в то время как другие не понимают, почему они его не получают.
Полагаю, что произошло следующее: пользователь из часового пояса, например, PST +8, вошёл в систему рано утром 14 марта, а затем поздно вечером 15 марта (для него это входы в разные дни), но система проверки значка интерпретировала 15 марта как полностью «пропущенный» день, прервав его серию из 365 дней подряд. Это может расстроить пользователя, особенно если он находится близко к завершению годового «забега».
Я понимаю, что часовые пояса и запросы к базе данных часто плохо сочетаются, но хотел бы узнать, можно ли что-то сделать, чтобы «расширить» запрос, возможно, добавив допуск для «дня UTC» в случае более длительных периодов получения значков, например, в течение года. Спасибо.
Таблица, хранящая записи о посещениях, использует обычную дату, а не временную метку, поэтому реализация допуска в несколько часов невозможна.
Всё зависит от того, чего ваша сообщество в итоге хочет. Вы можете отключить эту значок и создать аналогичный пользовательский значок, который срабатывает при меньшем количестве дней, чтобы этого хватило для покрытия этих дней. Или проверьте пользователей, у которых интервалы между посещениями никогда не превышают 1 день.
Они хотят, чтобы их значок работал независимо от часового пояса. Самые преданные пользователи — это те, кто здесь давно.
У нас есть запрос Data Explorer, похожий на этот, который помог выявить проблему:
-- [params]
-- user_list :users
WITH StartingPoints AS (
SELECT user_id, visited_at, ROW_NUMBER() OVER(ORDER BY user_id, visited_at) AS rownum
FROM user_visits AS A
WHERE NOT EXISTS (
SELECT 1
FROM user_visits AS B
WHERE B.visited_at = A.visited_at - INTERVAL '1 day' AND
B.user_id = A.user_id
) AND user_id IN (:users)
),
EndingPoints AS (
SELECT user_id, visited_at, ROW_NUMBER() OVER(ORDER BY user_id, visited_at) AS rownum
FROM user_visits AS A
WHERE NOT EXISTS (
SELECT 1
FROM user_visits AS B
WHERE B.visited_at = A.visited_at + INTERVAL '1 day' AND
B.user_id = A.user_id
) AND user_id IN (:users)
)
SELECT u.username, S.visited_at AS start_range, E.visited_at AS end_range, (E.visited_at - S.visited_at + 1) AS Days
FROM StartingPoints AS S
JOIN EndingPoints AS E ON E.rownum = S.rownum
JOIN users u ON u.id=S.user_id AND
u.id IN (:users)
ORDER BY u.id ASC, S.visited_at DESC
…что выводит список непрерывных отрезков. Из-за части UTC (или, скорее, из-за того, как хранится дата, а не дата и время?), кажется справедливым присвоить значок, даже если существует «разрыв в 1 день», на мой взгляд.
Мы подумаем над созданием ещё одного значка Devotee, основанного на изменении этого запроса, возможно, с интервалом в «2 дня»?
Мы получаем несколько запросов в службу поддержки относительно значка «Преданный» именно по этой причине. Обходное решение — выдать значок через консоль Rails. Инструкции по выполнению этой операции можно найти здесь: Award a non-custom badge through the console.
Если существует простой способ смягчить критерии значка, чтобы разрешить пропуск нескольких дней, я считаю, что это была бы отличная идея.