Для кастомного триггера, я думаю, вы сможете взять запрос Campaigner и немного доработать его, чтобы он работал с бейджами вместо приглашений.
Вот пример для получения 5 бейджей «Badge 108», который можно настроить на ежедневное обновление.
SELECT u.id user_id, current_timestamp granted_at
FROM users u
WHERE u.id IN (
SELECT ub.user_id
FROM user_badges ub
WHERE ub.badge_id = 108
GROUP BY ub.user_id
HAVING COUNT(*) >= 4
) AND u.active AND u.silenced_till IS NULL AND u.id > 0 AND
(:backfill OR u.id IN (:user_ids) )
Я кратко протестировал это на своём тестовом сайте, и всё работает нормально (я запускаю фоновую задачу Sidekiq для выдачи бейджей, чтобы ускорить ожидание). Надеюсь, это хотя бы даст вам отправную точку для дальнейшей разработки.
Также здесь есть несколько примеров, которые могут послужить вдохновением, если вы их ещё не нашли: Some common badge queries
> ActiveRecord::PreparedStatementInvalid: отсутствует значение для :backfill в /*
> * Запрос DataExplorer
> * Запрос: /admin/plugins/explorer?id=13
> * Инициатор: alefattorini
> */
> WITH query AS (
> SELECT u.id user_id, current_timestamp granted_at
> FROM users u
> WHERE u.id IN (
> SELECT ub.user_id
> FROM user_badges ub
> WHERE ub.badge_id = 102
> GROUP BY ub.user_id
> HAVING COUNT(*) >= 1
> ) AND u.active AND u.silenced_till IS NULL AND u.id > 0 AND
> (:backfill OR u.id IN (:user_ids) )
> ) SELECT * FROM query
> LIMIT 1000
Похоже, вы запустили это в исследователе данных. Для пользовательских SQL-значков вам нужно включить скрытую настройку сайта и добавить запрос на страницу значков:
Однако не все могут это сделать в зависимости от выбранного тарифа хостинга.
Но вариант с исследователем данных тоже вполне возможен, если у вас нет возможности использовать триггерные пользовательские SQL-запросы. Думаю, вам придётся решить, как часто запускать запрос и как вручать значки по результатам (вручную по одному или массово), но это точно выполнимо.
Возможно, лучше начать с чего-то простого, хотя, возможно, вы захотите добавить также параметр диапазона дат?
WITH foo AS (SELECT ub.user_id,count(ub.user_id), max(ub.granted_at) granted_at
FROM user_badges ub
WHERE ub.badge_id=108
GROUP BY ub.user_id)
SELECT user_id, granted_at
FROM foo
WHERE count >4
ORDER BY granted_at DESC
Отлично. Мне очень помогает копирование существующих запросов на бейджи и внесение небольших правок — это даёт понимание, с чего начать. Уверен, что при необходимости их можно будет ещё доработать, если возникнут какие-то проблемы.