使用“badge_posts”表的徽章查询在非公开类别中不会授予徽章

我们的一位用户曾拥有 5 枚“优质回复”徽章(点赞 100 篇帖子并收到 100 次点赞)。随后,我们将一些话题移至了私密分类,现在他只剩下 3 枚徽章。似乎徽章查询未统计已移动话题上的点赞(无论是发出的还是收到的),这可能是因为话题被移动了,也可能是因为它们现在属于私密话题。

在调试此问题时,我将徽章查询复制到了数据探索器(Data Explorer)中:

select p.user_id, p.id post_id, current_timestamp granted_at
from badge_posts p
where p.post_number > 1
and p.like_count >= 10

上述查询仅返回该用户的 3 条记录,但预期应为 5 条。我注意到它使用了 badge_posts 表。我在数据探索器的树状视图中找不到 badge_posts 表。因此,我将 badge_posts 改为 posts,结果按预期返回了 5 条记录。

badge_posts 表来自哪里?徽章查询是否应该改用 posts 表?

那张表曾让我困惑了很久。它定义在这里:discourse/lib/badge_posts_view_manager.rb at main · discourse/discourse · GitHub PostgreSQL 视图。据我理解,视图就是分配给某个查询的名称。

badge_posts 视图中的帖子是指那些可见且不在“仅限阅读”分类中的帖子。当你将话题移至私有分类时,相关帖子也就从 badge_posts 视图中移除了。

我们的私密类别并非完全私密——您只需接受一项政策即可访问。因此,我希望将该类别的帖子包含在内。我想我需要创建一个自定义徽章,其样式类似于“精彩回复”(以及“良好回复”和“优秀回复”),但使用帖子数量而非徽章帖子数量。