Abzeichen basierend auf mehrfacher Abzeichenvergabe zugewiesen

Hallo Leute
Ich möchte eine Auszeichnung basierend darauf vergeben, wie oft ein Benutzer eine bestimmte Auszeichnung erhält

  • Alessio hat die Foo-Auszeichnung mindestens 10 Mal erhalten → Cool_foo-Auszeichnung verdient
  • Luca hat die Foo-Auszeichnung mindestens 15 Mal erhalten → Super_foo-Auszeichnung verdient

Ist das mit einer SQL-Abfrage möglich?

1 „Gefällt mir“

Das ist möglich. :+1:

Gewähren Sie sie manuell (mithilfe des Datenexplorers + Massenvergabe) oder lösen Sie sie per SQL aus?

Beides. Die meisten davon sind manuell, aber ich versuche, alles zu automatisieren.

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. :slightly_smiling_face:

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 :+1:

3 „Gefällt mir“

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

Sieht so aus, als ob das Entfernen von
(:backfill OR u.id IN (:user_ids) )

auch gut funktioniert.
Ist es zwingend erforderlich?

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. :+1: 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

Ich habe dies aktiviert. Es funktioniert wie ein Zauber :smiley: danke

1 „Gefällt mir“

Das ist großartig. :slightly_smiling_face: 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. :+1:

1 „Gefällt mir“

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.