Звучит как интересный способ решения этой задачи. Мне было бы интересно узнать больше, если вы захотите поделиться подробностями!
Конечно. ![]()
В самой простой форме вы выбираете реакцию, которая означает «Я считаю, что это заслуживает значка». Участники могут использовать её для номинации постов, а запрос отслеживает посты, получившие эту реакцию. Затем вы можете вручную выдать значок из списка, предоставленного запросом, выдать его массово, если полностью доверяете списку, или даже настроить пользовательский SQL для значка, чтобы система делала это автоматически. ![]()
Вы также можете добавить дополнительные критерии в запрос, чтобы сделать его более точным. Например, «пост должен получить x количество этой реакции» или «учитывается только эта реакция, данная пользователями уровня TL2 и выше».
Это также работает с пользовательскими эмодзи, если вам не подошёл ни один из существующих.
Спасибо! Я немного поискал, но не смог найти запрос, который полностью соответствовал бы этому. Не могли бы вы поделиться им? Я сам никогда не создавал такие запросы, но чувствую, что мне нужно научиться этому!
У меня есть один вариант, над которым я работал, но отложил его, чтобы позже взглянуть свежим взглядом, и пока ещё не вернулся к нему, так что, возможно, его нужно доработать. Цель — выдать бейдж за наличие хотя бы 10 постов с реакцией
, поставленной участником из группы ‘data-team’ в категории #data-reporting:
SELECT p.user_id, MIN(p.created_at) granted_at
FROM badge_posts p
JOIN topic_tags tt ON tt.topic_id = p.topic_id
WHERE tt.tag_id = 615
AND EXISTS (
SELECT 1
FROM discourse_reactions_reactions dr
JOIN discourse_reactions_reaction_users dru ON dr.id = dru.reaction_id
JOIN group_users gu ON gu.user_id = dru.user_id
WHERE dr.post_id = p.id
AND dr.reaction_value = 'chefs_kiss'
AND gu.group_id = 175
)
GROUP BY p.user_id
HAVING COUNT(*) >= 10
Хотя меня не устраивало использование MIN, так как оно выдавало неверную дату вручения.
В этом варианте много критериев, и он автоматический, что, на мой взгляд, относит его к более сложным. Думаю, более простой вариант можно реализовать гораздо легче и без особых усилий.
Спасибо, это помогло! Вероятно, эту тему стоит перенести в отдельный тред, так как мы уходим от основной темы. Но вот запрос, который я составил (с помощью ChatGPT): он просто возвращает пользователей, поставивших или получивших реакцию, количество реакций, дату реакции и ссылку на конкретный пост. Единственное, что мне не удалось сделать — сделать ссылку на пост кликабельной; похоже, это ограничение касается только ссылок на темы.
WITH reaction_pairs AS (
SELECT
p.user_id AS received_reaction_user_id,
dru.user_id AS gave_reaction_user_id,
dr.post_id,
t.id AS topic_id,
t.slug AS topic_slug,
p.post_number,
dru.created_at AS reaction_date
FROM
discourse_reactions_reactions dr
JOIN discourse_reactions_reaction_users dru ON dr.id = dru.reaction_id
JOIN posts p ON dr.post_id = p.id
JOIN topics t ON p.topic_id = t.id
WHERE
dr.reaction_value = 'Your_Specific_Reaction_Here'
)
SELECT
ur1.id AS user_id,
ur2.username AS "User Who Gave Reaction",
'Your_Community_URL' || 't/' || rp.topic_slug || '/' || rp.topic_id || '/' || rp.post_number AS "Post URL",
rp.reaction_date AS "Reaction Date",
COUNT(*) AS "Number of Reactions"
FROM
reaction_pairs rp
JOIN users ur1 ON rp.received_reaction_user_id = ur1.id
JOIN users ur2 ON rp.gave_reaction_user_id = ur2.id
GROUP BY
ur1.id,
ur2.username,
rp.topic_slug,
rp.topic_id,
rp.post_number,
rp.reaction_date
ORDER BY
"Number of Reactions" DESC, "Reaction Date" DESC
Чтобы этот фрагмент заработал как надо, добавьте _url к имени столбца, то есть:
'Your_Community_URL' || 't/' || rp.topic_slug || '/' || rp.topic_id || '/' || rp.post_number AS post_url