上位バッジ取得時に下位バッジを無効にする?

すでに上位ティアが付与されている場合にカスタムバッジの権利を除外する方法は?目的は、ユーザーが資格を得た最も高いティアのみを付与することです…

たとえば、3つのバッジがあるとします。

ティア 1: 5 いいね、5 受信
ティア 2: 100 いいね、100 受信
ティア 3: 250 いいね、250 受信

以下のコードはティア 2 のものです。他のティアは、数値「100」以外に違いはありません。

SELECT us.user_id, current_timestamp AS granted_at 
FROM user_stats AS us
WHERE us.likes_received >= 100 
AND us.likes_given >= 100
AND (:backfill OR us.user_id IN (:user_ids))
「いいね!」 1

/admin/badges/BADGE-ID の設定で、Run revocation query daily オプションにチェックを入れるだけです。バッジは、SQL基準を満たさなくなった場合に削除されます。

付与/剥奪がほぼ同時に行われるように、Update Daily も有効にすることをお勧めします(インスタンスのローカル時間で深夜頃だと思います)。

「いいね!」 3

ありがとうございます、ネイサン。確認します。

「いいね!」 1

バッジSQLにバランスを取るための追加行が必要でしょうか?例えば次のようなものです。

SELECT us.user_id, current_timestamp AS granted_at 
FROM user_stats AS us
WHERE us.likes_received >= 100 
AND us.likes_given >= 100
AND us.likes_given < 250
AND (:backfill OR us.user_id IN (:user_ids))

(BETWEENなどを使用する可能性もありますが、まだテストしていません :slight_smile:

そして、クエリが実行されると、最初に100いいねのバッジが付与され、101から249までは無視され、250で取り消されます(次のバッジがそこから引き継がれます)。


更新: BETWEENを少し練習してみたところ、サンプルテストでは次のようなものが適切なユーザーをすべてキャッチするようです。

SELECT us.user_id
FROM user_stats AS us
WHERE us.likes_received BETWEEN 100 AND 249 
ORDER BY us.likes_received DESC

したがって、トリガーバッジに変換すると、次のようなものが機能するはずです。

SELECT us.user_id, current_timestamp AS granted_at 
FROM user_stats AS us
WHERE us.likes_received BETWEEN 100 AND 249
AND us.likes_given BETWEEN 100 AND 249
AND (:backfill OR us.user_id IN (:user_ids))
「いいね!」 3

これはほぼ完璧です。まれなイベントが発生する可能性があります。ユーザーが「付与」で過剰に提供し、「受信」で遅延する(またはその逆)場合、次のバッジが付与される前にバッジが失われる可能性があります(剥奪ルーチン)。

調べてみたところ、興味深いプロパティが見つかりました。something.badge_id = 123ここで「something」はユーザー定義変数、「123」は別のバッジのIDです。ティア1およびティア2の元のSQLに、上位ティアのバッジに対する失格チェックを追加して試してみます。

「いいね!」 2

それは私が考慮していなかった非常に興味深い点ですね。:slightly_smiling_face: 二重性があるため、少し厄介になりますね。:thinking:

他のバッジに対するチェックを組み込むというアイデアは良いですね。それは役立つかもしれません。

「いいね!」 1