Insignia asignada basada en la asignación de múltiples insignias

Hola a todos
Me gustaría asignar una insignia según cuántas veces un usuario obtiene una insignia específica

  • Alessio obtuvo la insignia foo al menos 10 veces → se ganó la insignia Cool_foo
  • Luca obtuvo la insignia foo al menos 15 veces → se ganó la insignia Super_foo

¿Es posible con una consulta SQL?

1 me gusta

Esto es posible. :+1:

¿Los estás otorgando manualmente (usando el explorador de datos + concesión masiva) o activándolos mediante SQL?

Ambos. La mayoría son manuales, pero estoy intentando automatizar todo.

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. :slightly_smiling_face:

También hay algunos ejemplos diferentes aquí que puedes usar como inspiración, si aún no lo has encontrado, Some common badge queries :+1:

3 Me gusta

Gracias, pero tengo un error en mi instalación

> 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 quitar
(:backfill OR u.id IN (:user_ids) )

también funciona bien
¿Es obligatorio?

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. :+1: 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

Tengo esto habilitado. Funciona a la perfección :smiley: gracias

1 me gusta

Genial. :slightly_smiling_face: 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. :+1:

1 me gusta

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.