Голосование за посты в Discourse

Я тоже так думаю. :slight_smile: Но Сэм категоричен в том, что это так:

Похоже, что пока таких бейджей ещё нет.

Если у вас есть конкретные критерии для бейджей, которые вы хотели бы создать, стоит открыть тему в канале #data-reporting для каждого из них. :+1:

Я думаю, несколько примеров могут выглядеть примерно так:

Получить 10 голосов на ответ в теме с голосованием за посты

SELECT p.user_id, p.created_at AS granted_at, p.id AS post_id
FROM post_voting_votes pvv
  JOIN posts p ON p.id = pvv.votable_id
WHERE pvv.direction = 'up'
  AND p.post_number <> 1
  AND (:backfill OR p.id IN (:post_ids))
GROUP BY p.user_id, p.id
HAVING COUNT(*) >= 10

Или более сложный вариант, где учитывается разница между «вверх» и «вниз» голосами:

WITH vote_totals AS (

SELECT 
    p.user_id,
    p.id AS post_id,
    p.created_at AS granted_at,
    (COUNT(*) FILTER (WHERE pvv.direction = 'up') - COUNT(*) FILTER (WHERE pvv.direction = 'down')) AS total
FROM post_voting_votes pvv
  JOIN posts p ON p.id = pvv.votable_id
WHERE p.post_number <> 1
GROUP BY 1, 2

)

SELECT *
FROM vote_totals 
WHERE total >= 10
  AND (:backfill OR post_id IN (:post_ids))

:red_exclamation_mark: Эти запросы потребуют дополнительного тестирования, чтобы убедиться, что они работают как задумано. :slight_smile:

Однако стоит учесть, что итоговое значение динамично: сегодня «10» завтра может превратиться в «5», если будут добавлены больше голосов «вниз» (во втором примере). А если бейдж основан только на голосах «вверх», как в первом примере, то вы могли получить 10, но в интерфейсе будет показано только 5, когда учтутся голоса «вниз».

5 лайков