如果你以匿名用户身份查看 @angus 的 Custom Wizard Plugin 主题中的嵌套回复视图:https://meta.discourse.org/n/-/73345.json?page=0&sort=old
/n/-/73345.json?page=0&sort=old 返回了 20 个根节点,而每一个都是已删除的占位符——cooked 内容为空,没有作者,total_descendant_count: 0。因此,整个第一页都是空白的“已移除”行。
同一批帖子的扁平视图则什么都不显示(帖子 #2 直接跳转到相关主题),所以在那里它们被正确隐藏了。嵌套视图保留了它们并将它们计入页面,这就是不匹配之处。
看起来树加载器有意拉入已删除的帖子(以便在仍有活跃回复的情况下保留已删除的父节点可见),但它也保留了没有任何可见回复的已删除帖子。在像这样一个早期回复都被删除的主题中,你最终会得到一整页的空占位符,而不是实际内容。
设置肯定是开启的——端点返回了 200 而不是 404。
罪魁祸首似乎是 NestedReplies::TreeLoader 中的 apply_visibility——scope.unscope(where: :deleted_at) 将每个已删除的帖子都拉入了树中。对于仍有活跃回复的已删除父节点来说,这很合理,但它也保留了已删除的叶子节点和完全删除的分支,这些节点占用了 ROOTS_PER_PAGE 窗口中的位置(并计入 has_more_roots)。
对于非工作人员,我认为除非已删除的帖子至少有一个未删除的后代,否则应该将其丢弃——仅在其可见的 total_descendant_count > 0 时保留。NestedViewPostStat 已经从不计已删除/低优先级后代中排除了这些,因此不需要额外的查询。
需要在构建页面的三个位置应用此逻辑,以避免页面内容不足:root_posts_scope、batch_preload_tree 以及页面填充 / has_more_roots 部分。工作人员的路径保持不变,以便恢复。

