在尝试从管理面板 → 用户删除特定用户创建的主题时,我遇到了 502 错误。
是否有其他方法可以删除特定用户创建的主题?
您好 @Yogesh_g,
您是想删除该用户创建的所有 301,719 篇帖子吗?
这似乎会让您留下很多因为缺少帖子而变得没有意义的主题。
在这种情况下,匿名化用户是否对您有意义?
我认为您之所以收到此 502 错误,是因为“删除所有帖子最大值”设置。
我已将限制提高到大于我要删除的数量,并且这些主题仅包含同一用户的帖子。
您能解释一下匿名用户是如何工作的吗?它会使所有其他用户都隐藏所有帖子吗?
我能以任何方式访问我正在使用的 Discourse 托管的数据库吗?
不,它不会隐藏帖子;它会移除用户名。当用户要求删除其帐户时,这有时是一个很好的解决方案,因为它保留了内容,使您的社区中的主题保持完整,同时使该内容匿名,因此没有人知道是谁写的。它在此处得到了充分描述:
如果您有托管的网站,最好让 Discourse 团队协助您。
这是一个非常独特的情况,涉及大量的 [database] 工作——难怪请求会超时。
听起来非常特别;我也建议联系托管支持以获得帮助。
好的,我会联系支持部门。并在那里更新大家。
是否有其他方法可以删除用户的所有帖子?或者我是否可以尝试创建一个自定义插件来从数据库中删除帖子(我的客户要求这样做,但我不知道它是否适用于大量帖子,因为 Discourse 已具备此功能)。
我应该创建插件还是不创建?如果创建,它将如何工作?
@ Michael Brown @southpaw 我创建了一个插件,可以按给定数量批量删除用户帖子。我编写了一些 Ruby 代码来删除帖子。目前我正在使用 settings api 从管理员那里获取输入。
我面临的挑战是。我想为插件创建一个管理员页面,其中包含一些输入字段和一个按钮。我希望我的 Ruby 代码在单击该按钮时运行。
我尝试了几种方法但都失败了。
有没有可能在 discourse 中实现这一点?
您好 @Yogesh_g,
![]()
我(还!)没有编写插件的经验,所以对于您提出的关于让管理页面正常工作的疑问,我没有快速的答案,但我希望确保您能获得所需的帮助。
我在这里整合这些信息时遇到了一些困难,所以我给您发了私信,以获取更多详细信息。
您好,discourse 社区 @pfaffman @merefield
我需要删除某个用户创建的所有帖子(总共 301,719 篇)。我尝试了各种方法,但都未能成功删除。
我应该如何删除该用户的所有帖子?请提供一种方法。我为此已经挣扎了 3 个月。
您是指永久删除还是软删除?
永久删除。我不希望任何用户看到这些帖子。
这个话题对您有用吗?
我认为这不完全是您想要的,但也许您可以修改它以满足您的需求?
这不起作用。我之前试过了。
我之前也遇到过类似的问题,需要根据很多条件删除不同用户的大约 200000 篇帖子。任何常规方法都会导致长期延迟。
最后我采用了最笨的方法。循环遍历从 1 到最大帖子 ID。如果满足条件,就删除它。我花了大约一个小时才遍历完(大约 900000 篇帖子)。
我尝试了类似的方法,但服务器返回了超时错误。以下是代码:
# frozen_string_literal: true
module Jobs
class DeleteUserPosts < ::Jobs::Scheduled
every 2.minutes
def execute(args)
return unless SiteSetting.delete_user_topics_enabled?
username = SiteSetting.delete_posts_for_username
posts_per_batch = SiteSetting.delete_posts_in_single_batch.to_i
return unless username.present? && posts_per_batch.positive?
user = User.find_by(username: username)
return unless user.present?
posts = user.posts.order(created_at: :asc)
deleted_count = 0
posts.each do |post|
break if deleted_count >= posts_per_batch
if SiteSetting.delete_user_topics_dry_run?
Rails.logger.error("DeleteUserPosts will remove Post ID #{post.id} (#{post.topic.title} - #{post.excerpt}) (dry run mode)")
else
Rails.logger.error("DeleteUserPosts removing Post ID #{post.id} (#{post.topic.title} - #{post.excerpt})")
begin
PostDestroyer.new(Discourse.system_user, post).destroy
deleted_count += 1
rescue StandardError => e
Rails.logger.error("Error deleting post ID #{post.id}: #{e.message}")
end
end
end
# Cancel the scheduled job if there are no more posts remaining
if posts.size <= posts_per_batch
self.class.cancel_scheduled_job
end
end
end
end
这显然可能出错。300000 篇帖子不是个小数目,你无法一次性将它们加载到内存中。
您能否分享您使用的代码片段,或举一个例子?