Zurückziehen eines Abzeichens niedrigerer Stufe, wenn eine höhere erreicht wird erreicht?

Wie schließe ich Rechte für ein benutzerdefiniertes Abzeichen aus, wenn bereits eine höhere Stufe gewährt wurde? Das Ziel ist es, nur die höchste Stufe zu gewähren, für die ein bestimmter Benutzer berechtigt ist…

Nehmen wir an, ich habe 3 Abzeichen:

Stufe 1: 5 vergebene Likes, 5 erhaltene Likes
Stufe 2: 100 vergebene Likes, 100 erhaltene Likes
Stufe 3: 250 vergebene Likes, 250 erhaltene Likes

Der folgende Code ist für Stufe 2. Andere Stufen unterscheiden sich nicht von der Zahl ‘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 „Gefällt mir“

In den Einstellungen unter /admin/badges/BADGE-ID aktivieren Sie einfach die Option Run revocation query daily. Der Badge wird entfernt, wenn die SQL-Kriterien nicht mehr erfüllt sind.

Sie möchten vielleicht auch Update Daily aktivieren, damit die Vergabe / der Widerruf ungefähr zur gleichen Zeit erfolgen (ich glaube, Mitternacht Ortszeit für Ihre Instanz).

3 „Gefällt mir“

Danke, Nathan. Ich werde es mir ansehen.

1 „Gefällt mir“

Benötigt dies auch eine zusätzliche Zeile in der Badge-SQL, um sie auszugleichen? Etwas wie:

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))

(möglicherweise mit BETWEEN oder ähnlichem, obwohl ich das noch nicht getestet habe :slight_smile:)

Und dann, wenn die Abfrage ausgeführt wird, wird sie beim ersten Mal die Auszeichnung für 100 Likes vergeben, sie für 101 bis 249 ignorieren und dann bei 250 widerrufen (wo die nächste Auszeichnung von dort aufgreift).


Update: Ich habe ein wenig mit BETWEEN geübt und etwas wie das scheint alle richtigen Leute im Beispieltest zu erfassen:

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

Etwas wie das sollte also funktionieren, wenn es in eine ausgelöste Auszeichnung umgewandelt wird:

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 „Gefällt mir“

Dies ist fast perfekt. Ein seltenes Ereignis kann eintreten: Der Benutzer liefert bei ‘gegeben’ über, während er bei ‘erhalten’ zurückbleibt (oder umgekehrt), sodass das Abzeichen verloren gehen könnte, bevor das nächste verliehen wird (Widerrufsroutine).

Ich habe mich umgesehen und eine interessante Eigenschaft entdeckt: something.badge_id = 123, wobei ‘something’ die benutzerdefinierte Variable und ‘123’ die ID eines anderen Abzeichens ist. Ich werde es versuchen und die ursprünglichen SQLs von Tier 1 und Tier 2 mit Disqualifikationsprüfungen gegen die Abzeichen der höheren Stufe ergänzen.

2 „Gefällt mir“

Das ist ein sehr interessanter Punkt, den ich nicht bedacht hatte. :slightly_smiling_face: Die doppelte Natur macht es ein wenig kniffliger. :thinking:

Mir gefällt die Idee, eine Überprüfung gegen die anderen Auszeichnungen einzubauen, das könnte nützlich sein.

1 „Gefällt mir“