Score_to_hide_post wird 0, wenn Reviewables jeweils nur eine Markierung haben

Zusammenfassung

score_to_hide_post kann auf 0 getrieben werden, da der Hintergrundjob Jobs::ReviewablePriorities priority_#{priorities[:high]} als 0 schreibt, wenn die Perzentilabfrage keine Zeilen zurückgibt. Der Job wird ausgelöst, wenn reviewable_count >= 15, aber die Perzentilberechnung schließt nur Reviewables ein, die HAVING COUNT(*) >= :target_count erfüllen (wobei target_count typischerweise 2 ist). Wenn die meisten Reviewables nur ein Flag haben, gibt die Perzentil-Unterabfrage nichts zurück → high wird 0score_to_hide_post = ((high * ratio) * scale).truncate(2) ergibt 0. Dies führt dazu, dass die Ausblendungsschwelle auf Null zusammenbricht und ein falsches Ausblendungsverhalten entsteht.


Woher das kommt (relevanter Code / Fakten)

  • score_to_hide_post wird berechnet über:
score_to_hide_post = ((high.to_f * ratio) * scale).truncate(2)
  • high wird aus dem Plugin-Speicher gelesen:
PluginStore.get("reviewables", "priority_#{priorities[:high]}")
  • Dieser Plugin-Speicher-Eintrag wird von Jobs::ReviewablePriorities (dem Systemjob) geschrieben.
    Der Job läuft, wenn:
reviewable_count = Reviewable.approved.where("score > ?", min_priority_threshold).count
return if reviewable_count < self.class.min_reviewables

wobei self.class.min_reviewables 15 ist.

  • Der Job berechnet high mit SQL:
SELECT COALESCE(PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY score), 0.0) AS medium,
       COALESCE(PERCENTILE_DISC(0.85) WITHIN GROUP (ORDER BY score), 0.0) AS high
FROM (
  SELECT r.score
  FROM reviewables AS r
  INNER JOIN reviewable_scores AS rs ON rs.reviewable_id = r.id
  WHERE r.score > :min_priority AND r.status = 1
  GROUP BY r.id
  HAVING COUNT(*) >= :target_count
) AS x

mit :target_count normalerweise 2.


Grundursache

Es gibt zwei separate Schwellenwerte, die zusammen eine Lücke erzeugen:

  1. Der Job wird ausgelöst, wenn mindestens min_reviewables (15) Reviewables über min_priority_threshold vorhanden sind – dies ist eine grobe Zählung, die die :target_count-Anforderung ignoriert.
  2. Aber die Perzentilberechnung, die high erzeugt, schließt nur Reviewables ein, die COUNT(*) >= :target_count erfüllen (d. h. mindestens 2 Reviewable-Scores). Wenn viele Reviewables jeweils nur ein Flag haben, liefert die Unterabfrage keine Zeilen und das Perzentil gibt den Fallback 0.0 zurück.

Der Job kann also laufen (weil es ≥ 15 Reviewables gemäß der groben Zählung gibt), aber die Perzentilaggregation hat keine qualifizierenden Zeilen (weil keine die HAVING-Bedingung erfüllen), was dazu führt, dass high 0 ist und dann priority_high als 0 geschrieben wird. Das fließt in score_to_hide_post ein und kollabiert es.


Auswirkung

  • score_to_hide_post wird 0, was fälschlicherweise dazu führen kann, dass Beiträge als ausgeblendet betrachtet werden oder andere Logik, die von einem angemessenen Ausblendungsschwellenwert abhängt, unterbrochen wird.
  • Dies tritt auf Websites auf, auf denen viele Reviewables vorhanden sind, aber jede nur ein einziges Flag/Reviewer hat, was auf kleineren/moderaten Communities nicht ungewöhnlich ist.

Vorgeschlagene Korrekturen (Optionen)

  1. Sicherstellen, dass die Perzentilabfrage genügend Zeilen zurückgibt, bevor geschrieben wird
  • Überprüfen Sie nach Ausführung der Perzentilabfrage, ob der Perzentilwert 0 ist und ob die Unterabfrage Zeilen zurückgegeben hat.
    Wenn keine Zeilen zurückgegeben wurden, überschreiben Sie nicht den vorhandenen priority_high; überspringen Sie stattdessen das Schreiben, behalten Sie den vorherigen Wert bei oder greifen Sie auf einen konfigurierten Standardwert zurück.
  • Dies ist der sicherste und am wenigsten invasive Ansatz.
  1. Anpassen des Job-Triggers, um target_count zu berücksichtigen
  • Ändern Sie die Job-Vorabprüfung so, dass sie nur ausgeführt wird, wenn die Anzahl der Reviewables, die HAVING COUNT(*) >= :target_count erfüllen, mindestens min_reviewables beträgt.
    Mit anderen Worten, zählen Sie Reviewables, gruppiert nach id, die COUNT(*) >= target_count erfüllen, und fahren Sie nur fort, wenn diese Anzahl ≥ min_reviewables ist.
  1. Administratoren erlauben, score_to_hide_post oder priority_high manuell festzulegen
  • Stellen Sie eine Option in der Admin-Oberfläche bereit, um score_to_hide_post oder priority_high direkt einzugeben oder anzupassen.
  • Auf diese Weise kann das System, auch wenn die Perzentilabfrage unerwartete Ergebnisse liefert (z. B. aufgrund zu weniger Stichproben), einen vom Administrator angegebenen angemessenen Schwellenwert verwenden und Fehler durch automatische Berechnungen verhindern.