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 0 → score_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_postwird berechnet über:
score_to_hide_post = ((high.to_f * ratio) * scale).truncate(2)
highwird 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
highmit 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:
- Der Job wird ausgelöst, wenn mindestens
min_reviewables(15) Reviewables übermin_priority_thresholdvorhanden sind – dies ist eine grobe Zählung, die die:target_count-Anforderung ignoriert. - Aber die Perzentilberechnung, die
higherzeugt, schließt nur Reviewables ein, dieCOUNT(*) >= :target_counterfüllen (d. h. mindestens2Reviewable-Scores). Wenn viele Reviewables jeweils nur ein Flag haben, liefert die Unterabfrage keine Zeilen und das Perzentil gibt den Fallback0.0zurü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_postwird0, 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)
- Sicherstellen, dass die Perzentilabfrage genügend Zeilen zurückgibt, bevor geschrieben wird
- Überprüfen Sie nach Ausführung der Perzentilabfrage, ob der Perzentilwert
0ist und ob die Unterabfrage Zeilen zurückgegeben hat.
Wenn keine Zeilen zurückgegeben wurden, überschreiben Sie nicht den vorhandenenpriority_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.
- Anpassen des Job-Triggers, um
target_countzu berücksichtigen
- Ändern Sie die Job-Vorabprüfung so, dass sie nur ausgeführt wird, wenn die Anzahl der Reviewables, die
HAVING COUNT(*) >= :target_counterfüllen, mindestensmin_reviewablesbeträgt.
Mit anderen Worten, zählen Sie Reviewables, gruppiert nachid, dieCOUNT(*) >= target_counterfüllen, und fahren Sie nur fort, wenn diese Anzahl ≥min_reviewablesist.
- Administratoren erlauben,
score_to_hide_postoderpriority_highmanuell festzulegen
- Stellen Sie eine Option in der Admin-Oberfläche bereit, um
score_to_hide_postoderpriority_highdirekt 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.