Atribuído um emblema com base na atribuição de vários emblemas

Olá pessoal
Gostaria de atribuir um distintivo com base em quantas vezes um usuário obtém um distintivo específico

  • Alessio obteve pelo menos 10 vezes o distintivo foo → distintivo Cool_foo ganho
  • Luca obteve pelo menos 15 vezes o distintivo foo → distintivo Super_foo ganho

É possível com uma consulta SQL?

1 curtida

Isso é possível. :+1:

Você está concedendo-os manualmente (usando o explorador de dados + concessão em massa) ou acionando-os por SQL?

Ambos. A maioria deles é manual, mas estou tentando automatizar tudo.

Para um acionado personalizado, acho que você deve conseguir roubar a consulta do Campaigner e ajustá-la para funcionar para emblemas em vez de convites.

Este é para ter 5 ‘Emblema 108’, e seria configurado para atualizar 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) )

Eu testei brevemente no meu site de teste e parece funcionar bem (eu aciono o trabalho Sidekiq de Concessão de Emblemas para acelerar a espera). Mas espero que isso pelo menos lhe dê um ponto de partida para construir. :slightly_smiling_face:

Há também alguns exemplos diferentes aqui que você pode usar como inspiração, se ainda não o encontrou, Some common badge queries :+1:

3 curtidas

Obrigado, mas recebi um erro na minha instalação

> ActiveRecord::PreparedStatementInvalid: valor ausente para :backfill em /*
>  * DataExplorer Query
>  * Query: /admin/plugins/explorer?id=13
>  * Started by: 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 remover
(:backfill OR u.id IN (:user_ids) )

também funciona bem
É obrigatório?

Parece que você executou isso no explorador de dados. Para os emblemas SQL personalizados, você precisaria ativar a configuração oculta do site e adicionar a consulta à página de emblemas:

No entanto, nem todos podem fazer isso, dependendo do seu pacote de hospedagem.

Mas um do explorador de dados é mais do que possível também, se você não puder ter os personalizados acionados por SQL. :+1: Acho que você teria que fazer algumas escolhas sobre com que frequência você o executaria e como os emblemas seriam concedidos a partir dos resultados (manualmente um por um, ou através da concessão em massa), mas é definitivamente factível.

Algo simples pode ser melhor, embora talvez você queira adicionar um parâmetro de intervalo de datas também?

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

Eu tenho isso habilitado. Funciona perfeitamente :smiley: obrigado

1 curtida

Isso é ótimo. :slightly_smiling_face: Acho que copiar as consultas de selo existentes e fazer alguns ajustes é bastante útil para me dar uma ideia de onde começar. Tenho certeza de que elas podem ser refinadas ainda mais se você encontrar algum problema com uma. :+1:

1 curtida

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