여러분 안녕하세요.
특정 배지를 사용자가 몇 번 획득했는지에 따라 다른 배지를 부여하고 싶습니다.
- Alessio가 foo 배지를 최소 10회 획득 → Cool_foo 배지 획득
- Luca가 foo 배지를 최소 15회 획득 → Super_foo 배지 획득
SQL 쿼리로 이걸 구현할 수 있을까요?
여러분 안녕하세요.
특정 배지를 사용자가 몇 번 획득했는지에 따라 다른 배지를 부여하고 싶습니다.
SQL 쿼리로 이걸 구현할 수 있을까요?
가능합니다. ![]()
수동으로 권한을 부여하고 계신가요 (데이터 탐색기 + 일괄 부여 사용), 아니면 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 작업을 트리거했습니다). 하지만 적어도 이것을 바탕으로 개발을 시작할 수 있는 출발점이 되길 바랍니다. ![]()
아직 찾지 못하셨다면 영감을 얻을 수 있는 몇 가지 다른 예제도 여기에 있으니 참고해 주세요. Some common badge queries ![]()
감사합니다. 하지만 설치 중 오류가 발생했습니다.
> 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 트리거 방식의 배지를 사용할 수 없다면 데이터 탐색기를 통한 방식도 충분히 가능합니다.
결과를 기반으로 배지를 어떻게 지급할지에 대한 선택(개별 수동 지급 또는 일괄 지급)과 실행 주기를 정해야 하지만, 충분히 실행 가능합니다.
다만, 더 간단한 방법이 좋을 수도 있으며, 날짜 범위 매개변수도 추가하는 것이 좋을까요?
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
저는 이 기능을 활성화해 두었습니다. 아주 잘 작동합니다
감사합니다
좋아요.
기존 배지 쿼리를 복사해서 살짝 수정하는 방식은 어디서부터 시작해야 할지 감을 잡는 데 꽤 유용하다고 생각합니다. 혹시 쿼리 사용 중 문제가 발생하면 나중에 더 정교하게 다듬을 수도 있으니 걱정 마세요. ![]()