Ein silbernes Abzeichen für _jedes_ 5 bronzene Abzeichen

Wir haben eine Bronzemedaille, Users Helping Users, für Leute erstellt, die versuchen, anderen Benutzern zu helfen. Diese wird manuell vergeben (um zwischen hilfreichen Versuchen und „Ich auch“-Beiträgen unterscheiden zu können).

Für jede 5 Bronzemedaillen möchten wir eine Silbermedaille, Invaluable, vergeben.

Die SQL-Abfrage, die ich erstellt habe, findet die richtigen zwei Benutzer, aber nur jeweils einmal:

SELECT user_id, current_timestamp AS granted_at 
FROM user_badges
WHERE badge_id = 110 -- Users Helping Users
    AND (:backfill OR user_id IN (:user_ids))
GROUP BY user_id
HAVING COUNT(*) >= 5

Fehlt mir ein :magic_wand: Zauber in meiner SQL-Abfrage, oder geschieht die Multiplikation außerhalb der SQL-Abfrage?

Außerdem ist mir nicht klar, wie die Berechnung abläuft, damit meine beiden Benutzer nicht jeden Tag neue Medaillen erhalten (dies wird nächtlich ausgeführt), selbst wenn sie keine 5 neuen Bronzemedaillen erhalten haben.

Gibt es eine Anleitung dazu, die meine Suche nicht gefunden hat?

Eine tiefere Suche führte mich zu einem Leitfaden, der mich zu diesem Leitfaden brachte.

Das mit dem Backfill ist immer noch etwas unklar, aber ich habe beschlossen, dies (natürlich!) auf unserer Testinstanz auszuprobieren. Ich nehme an, das Backfill läuft über Nacht, sodass ich morgen mehr weiß.

Es sei denn, Sie aktivieren „Kann mehrmals vergeben werden“, dann sollte es nicht öfter als einmal vergeben werden, auch wenn sie sich ein zweites (oder weiteres) Mal dafür qualifizieren. :+1:


Okay, ich habe Ihren Beitrag gründlicher gelesen und glaube, ich habe eine klarere Vorstellung davon, was Sie erreichen möchten.

Basierend auf der aktuellen SQL-Abfrage werden diese Benutzer das Silber-Abzeichen nur einmal erhalten, auch wenn Sie zulassen, dass es mehrmals vergeben wird:

  • Ich habe die entsprechenden Abzeichen auf meiner Testseite erstellt (einschließlich der Zulassung mehrerer Vergaben)
  • 5 Bronze-Abzeichen vergeben und den Hintergrundjob ausgeführt, um das Abzeichen zu vergeben (Silber-Abzeichen erfolgreich vergeben :partying_face:)
  • Ich habe dann den BadgeGrant-Job erneut ausgeführt und das Silber-Abzeichen wurde ihnen nicht ein zweites Mal vergeben
  • Ich habe dann ihre Bronze-Abzeichen auf 11 erhöht und den Badge-Grant-Job erneut ausgeführt
  • Es wurde kein zweites Silber-Abzeichen vergeben

Ich habe ‘mehrmals’ überprüft

aber es wurde nur einmal gewährt, obwohl es zweimal hätte sein sollen

1 „Gefällt mir“

Was muss ich also tun, damit mein Nutzer mit 12 Bronze-Abzeichen die 2 Silber-Abzeichen erhält, die er verdient?

1 „Gefällt mir“

Das ist eine gute Frage, auf die ich nicht sofort eine Antwort weiß. :slight_smile:

Ich denke vorläufig an etwas mit RANK, aber vielleicht greife ich nach Strohhalmen… :thinking:


Grober Prototyp...
WITH badge_count AS (

    SELECT
        user_id,
        granted_at,
        RANK() OVER (PARTITION BY user_id ORDER BY granted_at ASC) AS rank
    FROM user_badges
    WHERE badge_id = 110

)

SELECT user_id, granted_at
FROM badge_count
WHERE rank IN (5,10,15,20,25,30,35,40,45,50)

Okay, ein zweiter Versuch mit ROW_NUMBER anstelle von:

WITH badge_count AS (

    SELECT
        user_id,
        granted_at,
        ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY granted_at ASC) AS row
    FROM user_badges
    WHERE badge_id = 110

)

SELECT user_id, granted_at
FROM badge_count
WHERE row % 5 = 0

Bei weiterer Prüfung funktioniert dies in der Vorschau korrekt, wird aber nicht mehrmals gewährt, wenn der eigentliche badge grant-Job ausgeführt wird. Ich bin mir nicht wirklich sicher, warum. :thinking:

Ich habe mich selbst verwirrt. Ich werde eine Tasse Tee trinken und mich neu sammeln. :slight_smile:

1 „Gefällt mir“

Nun… ich habe meinem Benutzer gestern weitere 4 Bronzemedaillen gegeben, um zu sehen, ob der nächtliche Lauf zumindest das neue Abzeichen hinzufügt, das er gerade „verdient“ hatte. (Ich dachte, wenn ich den Rest von Hand aufholen müsste, könnte ich das tun.) Aber selbst das hat nicht funktioniert.

Ich kann Ihnen bei der Abfrage nicht helfen, schlage aber vor, dass Sie den Discourse AI Bot um Hilfe bitten – wählen Sie das Bot-Symbol oben \nimage -\u003e GPT-4 -\u003e SQL Helper.\n\nIch fand es sehr gut darin, Data Explorer-Abfragen zu erstellen, indem ich ihm einfach sage, was ich brauche, und ich schätze, dass es bei Badge-Abfragen helfen kann.

1 „Gefällt mir“

Nicht jeder hat das, Toni :shushing_face: Du machst die Leute eifersüchtig. :slight_smile: (obwohl @ganncamp das hat, also ist es eine Option)

Aber… ich bin ziemlich sicher, dass meine Abfrage korrekt ist. Sie wählt die richtigen in der Vorschau aus, vergibt aber nicht mehr als eine, wenn der Trigger ‘Täglich aktualisieren’ verwendet wird.

Ich habe eine weitere, fast identische eingerichtet, um sie zu testen, basierend auf einem Abzeichen für ‘alle 5 Beiträge in einem bestimmten Thema’ unter Verwendung des Triggers ‘Wenn ein Benutzer einen Beitrag erstellt oder bearbeitet’ - und diese funktioniert perfekt. Ich erkunde, was der Unterschied sein könnte…

Hier ist die SQL für dieses Testabzeichen zum Vergleichen, falls jemand etwas entdecken kann:

WITH post_count AS (

    SELECT
        user_id,
        id,
        created_at,
        ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at ASC) AS row
    FROM posts
    WHERE topic_id = 864

)

SELECT user_id, created_at granted_at, id post_id
FROM post_count
WHERE row % 5 = 0
  AND (:backfill OR id IN (:post_ids))

2 „Gefällt mir“

Ich habe Zugriff darauf, @tpetrov, aber meine Versuche, ihn zu nutzen, waren… weniger als fruchtbar. Oder vielleicht bin ich einfach gut darin, schwierige Fragen zu stellen? :laughing:

1 „Gefällt mir“

Nach ein wenig Erkundung und Rücksprache scheint es, dass der automatische Badge-Granter nur mehrere Badges vergibt, wenn diese auf bestimmten Beiträgen basieren. Diese Art von Badges vergibt also nur den ersten Badge (die Vorschau ist irreführend :frowning:).

Ich denke, in ähnlichen Fällen können „eskalierende“ Badges gut funktionieren (wie die „Gelösten“). Also zum Beispiel ein Silber für 30 und ein Gold für 100, wenn das eine praktikable Alternative sein könnte?

Also… obwohl die Bronze-Abzeichen auf Beiträgen basieren… zählt das nicht, oder?

Ich weiß nicht. Ich glaube, ich verstehe die Frage nicht. :laughing:

Ich schätze, der Vorschlag ist nicht, 5 Abzeichen zu finden, sondern 5 Beiträge, für die ein Abzeichen vergeben wurde? Das kann ich tun. Ich habe es in meinem Bericht „Neue Beiträge finden, für die Abzeichen vergeben werden sollen“ mehr oder weniger bereits getan.

Hmmm. :denkend: Ich glaube, ich verstehe, worauf Sie hinauswollen. Lassen Sie mich es noch einmal versuchen…


@ganncamp - Ich glaube, wir haben vielleicht etwas Erfolg… :leicht_lächelnd:

Basierend darauf, dass Bronze Badge A durch den Post-Schraubenschlüssel vergeben wird oder indem ein Grund auf der Seite /admin/users/{user_id}/{username}/badges angegeben wird:

Dann denke ich, dass dies tatsächlich möglich ist. :party:

WITH badge_count AS (

    SELECT 
        user_id,
        granted_at,
        post_id,
        ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY granted_at DESC) AS row
    FROM user_badges
    WHERE badge_id = 110
      AND post_id IS NOT NULL
)

SELECT user_id, granted_at, post_id
FROM badge_count
WHERE row % 5 = 0
  AND (:backfill OR post_id IN (:post_ids))

(Das Hinzufügen von AND post_id IS NOT NULL schützt es, falls jemand einen ohne Grund erhält, sonst bricht es ab)

Ich habe es gerade ausprobiert und die Zeit vorgespult, indem ich den GrantBadge-Hintergrundjob ausgelöst habe, und mein Testbenutzer hat endlich die volle Anerkennung erhalten, die er verdient. :leicht_lächelnd:

Dann habe ich ihm 5 weitere Badge A für 5 weitere verschiedene Posts verliehen und es erneut ausgeführt: :tada:

3 „Gefällt mir“

Danke @JammyDodger! :tada: :tada: :tada:

Ich habe dies auf meiner Testinstanz eingerichtet (nicht, dass ich dir nicht vertraue :joy:) und hoffe, dies diese Woche in Produktion zu nehmen! :star_struck:

Und… ist das ein guter Zeitpunkt, um zu fragen, ob das Tutorial mit den Dingen aktualisiert werden kann, die du auf dieser Quest gelernt hast? :smiley:

Oh, sicher. Vertrauen, aber überprüfen ist definitiv eine kluge Wahl. :slight_smile:

Ich werde sehen, ob ich ein kleines Extra hinzufügen kann. :slight_smile: :+1:

2 „Gefällt mir“

Nun… als der Job über Nacht lief, erhielt mein Benutzer mit 6 Bronzen 1 Silber :white_check_mark: mein Benutzer mit 13 Bronzen erhielt… 1 Silber :slightly_frowning_face:

Dieser Teil des Tutorials ließ mich denken, dass ein separater, expliziter Backfill-Job nicht notwendig war

Da täglich ein vollständiger Backfill unabhängig davon ausgeführt wird, müssen Sie dies berücksichtigen und die Behandlung des Parameters :backfill einschließen.

Wie erhalte ich für Benutzer, die bereits mehr als 1 Silber gewonnen haben, die Auszeichnungen? Muss ich das manuell machen?

Der Backfill ist der tägliche Job. Der Trigger „Täglich aktualisieren“ ist im Wesentlichen genau das, während die anderen Trigger viel mehr „zur Zeit“ sind (z. B. wenn ein Abzeichen „wenn ein Benutzer einen Beitrag erstellt oder bearbeitet“ verwendet, müsste es nicht über Nacht warten, um es verliehen zu bekommen).

Können Sie einen Screenshot Ihres Abzeichens einfügen, damit ich sehen kann, was möglicherweise anders ist?

Hier bitte:

Übrigens, einige dieser Dinge habe ich überprüft, weil… ich weiß nicht, was ich tue :joy:

1 „Gefällt mir“

Und Ihr Benutzer mit 13 ‘Abzeichen A’ hat die Gründe ausgefüllt, wenn Sie sich seine Seite /admin/users/{user_id}/{username}/badges ansehen?

Sie haben die wichtigen Teile gleich. :slight_smile: Die anderen sind immer noch legitim, aber optional.

Führen Sie dies auf Ihrer Staging-Site oder auf einer selbst gehosteten Test-Site aus?

Woah! Geheimnis gelöst!

Ich hatte angenommen, der Job würde in den frühen Morgenstunden (meines) Morgens laufen.

Tatsächlich hatte ich diesem Benutzer ursprünglich ohne Gründe Abzeichen verliehen, also habe ich gestern alle widerrufen, Beiträge von ihm ausgegraben und neu verliehen. Der Job lief mitten in meiner Verleihung.

Das ist übrigens auf meiner Staging-Seite.

Ich nehme an, das zweite Abzeichen wird in ein paar Stunden verliehen, aber ich möchte sehen, wie mehrere Abzeichen auf einmal verliehen werden. Wird das passieren, wenn ich das Silber widerrufe? Wird ihm in… 2 Stunden 2 neue Silber verliehen?

1 „Gefällt mir“