Назначена значок на основе множественного назначения значков

Привет, ребята!
Хотел бы назначить бейдж в зависимости от того, сколько раз пользователь получил определённый бейдж:

  • Если Алессио получил бейдж foo не менее 10 раз —> получен бейдж Cool_foo
  • Если Лука получил бейдж foo не менее 15 раз —> получен бейдж Super_foo

Возможно ли это сделать с помощью SQL-запроса?

Это возможно. :+1:

Вы выдаёте их вручную (через Data Explorer и массовую выдачу) или запускаете через SQL?

Оба. Большинство из них выполняются вручную, но я пытаюсь автоматизировать всё.

Для кастомного триггера, я думаю, вы сможете взять запрос 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 для выдачи бейджей, чтобы ускорить ожидание). Надеюсь, это хотя бы даст вам отправную точку для дальнейшей разработки. :slightly_smiling_face:

Также здесь есть несколько примеров, которые могут послужить вдохновением, если вы их ещё не нашли: Some common badge queries :+1:

Спасибо, но у меня ошибка при установке

> 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

Похоже, что удаление
(:backfill OR u.id IN (:user_ids) )
тоже хорошо работает.
Это обязательно?

Похоже, вы запустили это в исследователе данных. Для пользовательских SQL-значков вам нужно включить скрытую настройку сайта и добавить запрос на страницу значков:

Однако не все могут это сделать в зависимости от выбранного тарифа хостинга.

Но вариант с исследователем данных тоже вполне возможен, если у вас нет возможности использовать триггерные пользовательские SQL-запросы. :+1: Думаю, вам придётся решить, как часто запускать запрос и как вручать значки по результатам (вручную по одному или массово), но это точно выполнимо.

Возможно, лучше начать с чего-то простого, хотя, возможно, вы захотите добавить также параметр диапазона дат?

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

У меня это включено. Работает как по маслу :smiley: спасибо

Отлично. :slightly_smiling_face: Мне очень помогает копирование существующих запросов на бейджи и внесение небольших правок — это даёт понимание, с чего начать. Уверен, что при необходимости их можно будет ещё доработать, если возникнут какие-то проблемы. :+1: