Devotee Badgeとタイムゾーン、要件緩和は可能でしょうか?

Devoteeバッジ(連続365日のログインが必要)に関するユーザーからの報告が数件ありました。問題は、UTCから大きく離れたタイムゾーン(例えばPST+8など)にいるユーザーが、基盤となる「日付」がUTC時間基準であることを考慮する必要がある点のようです。欧州のユーザーはバッジを取得している一方、他のユーザーはなぜ取得できないのか理解できていない状況です。

私が推測するところでは、PST+8のユーザーが3月14日の早朝にログインし、その後3月15日の夜遅くにログインした場合(彼らにとっては毎日ログインしていることになりますが)、システムのバッジ照会では3月15日が完全に「スキップ」され、365日連続の記録が途切れてしまう可能性があります。特に1年間の記録が終了間近のユーザーにとっては、この状況は非常に落胆を招くものです。

タイムゾーンとデータベースクエリの組み合わせは往々にして問題を引き起こしますが、1年のような長いバッジ期間においては、「UTC日」に対してある程度の寛容性を持たせるために、クエリを「広げる」ような対応が可能かどうかご検討いただけますと幸いです。よろしくお願いいたします。

「いいね!」 9

訪問を記録するテーブルは、タイムスタンプではなく単純な日付を使用しているため、数時間の許容範囲を実装することは現実的ではありません。

最終的にコミュニティが何を望むかによります。そのバッジを無効にし、より少ない日数で発動する同等のカスタムバッジを作成して、その期間をカバーできるようにする方法があります。または、訪問のギャップが常に 1 日以内であるユーザーを確認する方法もあります。

「いいね!」 7

ご覧いただき、ご返信ありがとうございます。

彼らは、タイムゾーンに関係なくバッジが機能することを望んでいます。長年のユーザーほど情熱的です。:slight_smile:

この問題の特定に役立った、以下のような 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 部分(あるいは、datetime ではなく日付がどのように格納されているかという点)を考慮すると、「1 日のギャップ」が存在してもバッジを授与するのは妥当だと考えられます。

このクエリを基に、別の Devotee バッジを作成しようと考えています。おそらく「2 日」の INTERVAL に変更するかもしれません。

「いいね!」 6

この理由により、Devoteeバッジに関するサポートリクエストがいくつか寄せられています。回避策として、Railsコンソールを通じてバッジを付与する方法があります。その手順は以下で説明されています:https://meta.discourse.org/t/how-to-award-a-non-custom-badge-through-the-console/103269。

もしバッジの条件を緩和して、数日の欠勤を許容する簡単な方法があれば、それは良いアイデアだと思います。

「いいね!」 5