Para uno activado personalizado, creo que deberías poder copiar la consulta de Campaña y modificarla para que funcione para insignias en lugar de invitaciones.
Este es para tener 5 ‘Insignia 108’, y se configuraría para actualizarse diariamente.
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) )
Lo he probado brevemente en mi sitio de prueba y parece funcionar bien (activo el trabajo Sidekiq de Concesión de Insignias para acelerar la espera). Pero espero que al menos te dé un punto de partida para construir.
También hay algunos ejemplos diferentes aquí que puedes usar como inspiración, si aún no lo has encontrado, Some common badge queries
> ActiveRecord::PreparedStatementInvalid: valor faltante para :backfill en /*
> * Consulta de DataExplorer
> * Consulta: /admin/plugins/explorer?id=13
> * Iniciado por: 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
Parece que ejecutaste eso en el explorador de datos. Para las insignias SQL personalizadas, necesitarías activar la configuración oculta del sitio y agregar la consulta a la página de insignias:
Sin embargo, no todos pueden hacer eso dependiendo de su paquete de alojamiento.
Pero una del explorador de datos es más que posible también si no puedes tener las personalizadas activadas por SQL. Creo que tendrías que tomar algunas decisiones sobre con qué frecuencia la ejecutarías y cómo se otorgarían las insignias a partir de los resultados (manualmente una por una, o a través de la concesión masiva), pero definitivamente es factible.
Algo simple puede ser mejor, ¿aunque quizás quieras agregar también un parámetro de rango de fechas?
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
Genial. Me resulta muy útil copiar las consultas de insignias existentes y hacer algunos ajustes para tener una idea de por dónde empezar. Estoy seguro de que también se pueden refinar más si encuentras algún problema con alguna.