What is the bug reporter badge?

Oh, sorry, I didn’t look at the context the query was being used in. You’ve currently got something like this:

WHERE category_id = (
  SELECT id FROM categories
  WHERE name IN ('OAuth', 'Developers')
)

Since the inner query is returning multiple rows, you need to change the outer WHERE clause to:

WHERE category_id IN (
  SELECT id FROM categories
  WHERE name IN ('OAuth', 'Developers')
)
「いいね!」 1

Success, thanks!

Would this be too much to run whenever a user acts on a post?

Could it easily be modified to award a badge when a post is ‘marked as a solution’ rather than liked?

edit: Actually, that’s giving me: ‘Contract violation: Query triggers on posts, but does not reference the ‘:post_ids’ array’

I can probably live with update daily though. ¯_(ツ)_/¯

@sam, we’re looking on implementing a similar badge over at Stonehearth. Can you share the current SQL used, as yours is 2+ years old, and there are numerous different versions in this topic?

「いいね!」 1

Bug Reporter

SELECT distinct p.user_id, p.created_at granted_at, p.id post_id
FROM badge_posts p
JOIN topics t ON t.id = p.topic_id
JOIN post_actions pa ON pa.post_id = p.id AND 
      post_action_type_id = (
                SELECT id FROM post_action_types WHERE name_key = 'like'
       ) AND 
       pa.user_id IN (
           SELECT gu.user_id
           FROM group_users gu
           WHERE gu.group_id = ( SELECT id FROM groups WHERE name ilike 'team' ) 
       )
WHERE category_id = (
  SELECT id FROM categories WHERE name ilike 'bug'
) AND p.post_number = 1

Tech Support

SELECT id user_id, current_timestamp granted_at
FROM users
WHERE id  IN (
       SELECT p1.user_id 
       FROM post_custom_fields pc
       JOIN badge_posts p1 ON p1.id = pc.post_id
       JOIN topics t1 ON p1.topic_id = t1.id
       WHERE p1.user_id <> t1.user_id AND 
                    name = 'is_accepted_answer' AND 
            p1.user_id IN (
                   SELECT user_id 
                   FROM posts 
                   WHERE :backfill OR  p1.id IN (:post_ids)
            )
        GROUP BY p1.user_id
        HAVING COUNT(*) > 9
)

Tester

SELECT p.user_id, MIN(p.created_at) granted_at
  FROM posts p
  JOIN topics t ON t.id = p.topic_id
 WHERE t.category_id = (SELECT id FROM categories WHERE name ILIKE 'bug')
   AND p.post_number = 1
   AND EXISTS (
         SELECT 1
           FROM post_actions pa
          WHERE pa.post_id = p.id 
            AND pa.post_action_type_id = (SELECT id FROM post_action_types WHERE name_key = 'like') 
            AND pa.user_id IN (SELECT user_id FROM group_users WHERE group_id = (SELECT id FROM groups WHERE name ILIKE 'team'))
       )
 GROUP BY p.user_id
HAVING COUNT(*) >= 10

Senior Tester

SELECT p.user_id, MIN(p.created_at) granted_at
  FROM posts p
  JOIN topics t ON t.id = p.topic_id
 WHERE t.category_id = (SELECT id FROM categories WHERE name ILIKE 'bug')
   AND p.post_number = 1
   AND EXISTS (
         SELECT 1
           FROM post_actions pa
          WHERE pa.post_id = p.id 
            AND pa.post_action_type_id = (SELECT id FROM post_action_types WHERE name_key = 'like') 
            AND pa.user_id IN (SELECT user_id FROM group_users WHERE group_id = (SELECT id FROM groups WHERE name ILIKE 'team'))
       )
 GROUP BY p.user_id
HAVING COUNT(*) >= 20
「いいね!」 12

I was just awarded the Tester badge, but I only have 2 Bug Reporter badges. The text of the Tester badge says this:

grafik

Reported 10 bugs that were liked by the Discourse team

I just checked: One of my bug reports has 10 :heart: likes, but not even those are exclusively by Discourse Team members.

Something seems to be wrong with the badge… :thinking:

「いいね!」 2

There are several old bugs that were deleted as not of future historical interest, but the total isn’t 10.

「いいね!」 2

Thanks, I fixed the queries and updated @sam’s post.

「いいね!」 7

@sam このコードはどこで実行すればこのバッジを割り当てられますか、またバグレポートのカテゴリを作成すべきですか?

SELECT p.user_id, MIN(p.created_at) granted_at
  FROM posts p
  JOIN topics t ON t.id = p.topic_id
 WHERE t.category_id = (SELECT id FROM categories WHERE name ILIKE 'bug')
   AND p.post_number = 1
   AND EXISTS (
         SELECT 1
           FROM post_actions pa
          WHERE pa.post_id = p.id
            AND pa.post_action_type_id = (SELECT id FROM post_action_types WHERE name_key = 'like')
            AND pa.user_id IN (SELECT user_id FROM group_users WHERE group_id = (SELECT id FROM groups WHERE name ILIKE 'team'))
       )
 GROUP BY p.user_id
HAVING COUNT(*) >= 20

このバッジはメタに固有のものです。

ディスコースでは使えないのですか?

「いいね!」 1

はい、できます。ただし、カテゴリ名とグループ名は有効な名前に変更する必要があります。

「いいね!」 3

承知しました。カテゴリのトリックを隠すようなものですが、ここではsamコードをどこで実行すればよいかわかりません。管理パネル内ですか、それともコンテナのrails c内ですか?

「いいね!」 1

コードを追加する場所が見つからないのは、バッジSQLの編集がデフォルトで無効になっているためです。こちらをご覧ください。

そのため、手順は以下のようになると考えられます。

  1. バッジSQLの編集を有効にする(リンク先のトピックに手順があります)
  2. 管理 > バッジで新しいバッジを作成する(または、すでに作成済みの場合は既存のバッジを編集する)
  3. バッジにSQLを追加して保存する
  4. バッジSQLの編集を無効にする

その後、もしまだ行っていない場合は、投稿されたSQLの値から判断して以下の手順を行います。

  1. 「bug」という名前のカテゴリを作成する
  2. 「team」という名前のユーザーグループを作成する
  3. バグレポートを受け入れられるようにしたいユーザーを「team」に追加する
「いいね!」 5

これはクエリの改善になるかもしれません :slight_smile:

WITH LikeActionTypes AS (
    SELECT id 
    FROM post_action_types 
    WHERE name_key = 'like'
),

DiscourseGroup AS (
    SELECT id 
    FROM groups 
    WHERE name ILIKE 'discourse'
),

BugCategory AS (
    SELECT id 
    FROM categories 
    WHERE name ILIKE 'bug'
)

SELECT 
    p.user_id, 
    MIN(p.created_at) AS granted_at, 
    MIN(p.id) AS post_id
FROM badge_posts AS p
LEFT JOIN topics AS t ON t.id = p.topic_id
LEFT JOIN post_actions AS pa ON pa.post_id = p.id 
LEFT JOIN LikeActionTypes AS lat ON pa.post_action_type_id = lat.id
LEFT JOIN group_users AS gu ON pa.user_id = gu.user_id
LEFT JOIN DiscourseGroup AS dg ON gu.group_id = dg.id
LEFT JOIN BugCategory AS bc ON t.category_id = bc.id
WHERE p.post_number = 1
GROUP BY p.user_id;
「いいね!」 2