Für eine benutzerdefinierte Auslösung sollten Sie meiner Meinung nach die Kampagnenabfrage kopieren und anpassen können, damit sie für Abzeichen anstelle von Einladungen funktioniert.
Diese hier ist für 5 ‘Abzeichen 108’ und würde täglich aktualisiert werden.
SELECT u.id user_id, current_timestamp granted_at
FROM users u
WHERE u.id IN (
SELECT ub.user_id
FROM user_badges ub
WHERE ub.badge_id = 108
GROUP BY ub.user_id
HAVING COUNT(*) >= 4
) AND u.active AND u.silenced_till IS NULL AND u.id > 0 AND
(:backfill OR u.id IN (:user_ids) )
Ich habe es kurz auf meiner Testseite getestet und es scheint gut zu funktionieren (ich löse den Badge Grant Sidekiq-Job aus, um die Wartezeit zu verkürzen). Aber hoffentlich gibt Ihnen das zumindest einen Ausgangspunkt zum Aufbau.
Es gibt auch ein paar verschiedene Beispiele hier, die Sie als Inspiration verwenden können, falls Sie sie noch nicht gefunden haben: Some common badge queries
Vielen Dank, aber ich habe einen Fehler bei meiner Installation
> ActiveRecord::PreparedStatementInvalid: fehlender Wert für :backfill in /*
> * DataExplorer Query
> * Query: /admin/plugins/explorer?id=13
> * Started by: alefattorini
> */
> WITH query AS (
> SELECT u.id user_id, current_timestamp granted_at
> FROM users u
> WHERE u.id IN (
> SELECT ub.user_id
> FROM user_badges ub
> WHERE ub.badge_id = 102
> GROUP BY ub.user_id
> HAVING COUNT(*) >= 1
> ) AND u.active AND u.silenced_till IS NULL AND u.id > 0 AND
> (:backfill OR u.id IN (:user_ids) )
> ) SELECT * FROM query
> LIMIT 1000
Es sieht so aus, als hätten Sie das im Data Explorer ausgeführt. Für die benutzerdefinierten SQL-Badges müssten Sie die versteckte Site-Einstellung aktivieren und die Abfrage zur Badge-Seite hinzufügen:
Allerdings kann nicht jeder das tun, abhängig von seinem Hosting-Paket.
Aber ein Data Explorer ist auch mehr als möglich, wenn Sie keine benutzerdefinierten SQL-Badges auslösen können. Ich denke, Sie müssten einige Entscheidungen darüber treffen, wie oft Sie ihn ausführen und wie die Badges aus den Ergebnissen vergeben werden (manuell einzeln oder durch Massenvergabe), aber es ist definitiv machbar.
Etwas Einfaches ist vielleicht besser, obwohl Sie vielleicht auch einen Datumsbereichsparameter hinzufügen möchten?
WITH foo AS (SELECT ub.user_id,count(ub.user_id), max(ub.granted_at) granted_at
FROM user_badges ub
WHERE ub.badge_id=108
GROUP BY ub.user_id)
SELECT user_id, granted_at
FROM foo
WHERE count >4
ORDER BY granted_at DESC
Das ist großartig. Ich finde es sehr nützlich, die vorhandenen Badge-Abfragen zu kopieren und leicht anzupassen, um eine Vorstellung davon zu bekommen, wo ich anfangen kann. Ich bin sicher, dass sie dann auch weiter verfeinert werden können, wenn Sie auf Probleme stoßen.