여러 배지 할당 기준으로 배지 지정됨

여러분 안녕하세요.
특정 배지를 사용자가 몇 번 획득했는지에 따라 다른 배지를 부여하고 싶습니다.

  • Alessio가 foo 배지를 최소 10회 획득 → Cool_foo 배지 획득
  • Luca가 foo 배지를 최소 15회 획득 → Super_foo 배지 획득

SQL 쿼리로 이걸 구현할 수 있을까요?

가능합니다. :+1:

수동으로 권한을 부여하고 계신가요 (데이터 탐색기 + 일괄 부여 사용), 아니면 SQL로 트리거하고 계신가요?

둘 다입니다. 대부분 수동으로 처리하고 있지만, 모든 것을 자동화하려고 노력하고 있습니다.

사용자가 직접 트리거하는 배지의 경우, 캠페이너(Campaigner) 쿼리를 가져와서 초대장이 아닌 배지에 맞게 수정할 수 있을 것 같습니다.

아래 쿼리는 'Badge 108’을 5개 보유한 사용자를 대상으로 하며, 매일 업데이트되도록 설정됩니다.

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: missing value for :backfill in /*
>  * 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

(:backfill OR u.id IN (:user_ids) )

을 제거하는 것도 잘 작동하는 것 같습니다.
이것은 필수적인가요?

데이터 탐색기(Data Explorer)에서 실행한 것 같습니다. 사용자 정의 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: