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