查看我们的一个徽章页面时,我注意到:
这让我感到好奇——这些头像都发生了什么事?
原来,这些用户并不存在。
我们或许不应该向已不存在的用户授予徽章?或者至少阻止它们被显示?无论如何,这些头像正在挤占真实用户(也就是我们真正关心的用户)的头像位置!
查看我们的一个徽章页面时,我注意到:
这让我感到好奇——这些头像都发生了什么事?
原来,这些用户并不存在。
我们或许不应该向已不存在的用户授予徽章?或者至少阻止它们被显示?无论如何,这些头像正在挤占真实用户(也就是我们真正关心的用户)的头像位置!
嗯……这里似乎有些不对劲,因为:
grant 已经关联到了 user,它必须从某个地方获取 user_id。
我想知道这种作用域的方式是否意味着 dependent: :destroy 没有正常工作。
无论如何,我们可以添加一个每周清理任务。
考虑到这些徽章授予的时间(截至撰写本文时它们是最最新的),我怀疑这些徽章是在用户账户不存在时授予的,而不是在账户存在时授予、随后在账户删除时未删除。
需要进一步核实。
这很奇怪,因为行中包含用户 ID,如果用户被清除,就无处获取这些 ID 了。
我认为用户 ID 存储在 incoming_links 表中。这些记录不会被级联删除,而分享徽章查询仅防止 incoming_links 表中的 user_id 为 null:
https://github.com/discourse/discourse/blob/main/lib/badge_queries.rb#L199
“首次分享”徽章应该存在类似的漏洞:
https://github.com/discourse/discourse/blob/main/lib/badge_queries.rb#L64
我创建了一个拉取请求,将这些徽章查询关联到 users 表——这是我的第一个拉取请求,希望一切顺利!