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.
Há também alguns exemplos diferentes aqui que você pode usar como inspiração, se ainda não o encontrou, Some common badge queries
> 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 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. 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
Isso é ótimo. 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.