删除某用户在某分类中的所有消息

Hi guys,

Recently I had the need to delete all posts from a user in a specific category. Leaving aside “debates” on deleting content I thought “oh, easy, just use the search and then pick all the results using the checkboxes and delete them”.

However, it seems that doing so allows me to delete The Topics and not so much the messages, even though the search is giving me the messages as results, not necessarily the topics (although they are there as well, yes).

Is there a “safe” way of doing this? At first I thought that I would be something very extreme to the DB (and I don’t discard that possibility) but since I can bulk-delete 50+ topics from the UI… maybe there is a way of doing that for messages only? (Or a way using the console, I just don’t want to “try” and blow up the DB :stuck_out_tongue: )

Thanks!

1 个赞

I don’t have personal experience of these, but I believe you can ‘soft’ delete using the API -

And there are a few topics on ‘hard’ deleting if you search for ‘rails delete post’.

If you can give a few more details about what you’re trying to achieve, people may have more specific tips.

Hi @JammyDodger

Thanks for the links.

I just want to delete all messages from a user in a specific category. :stuck_out_tongue:

PD: Maybe using the Console? I just don’t want to nuke my DB…

1 个赞

There’s some ongoing discussion about a similar thing in this topic: Delete deleted-posts permanently in bulk?

Hopefully that can provide some inspiration?

抱歉打扰了,如果需要,我可以创建一个新帖子。

我们有一个政治类别,一些用户希望删除他们在这个类别中的所有帖子,原因显而易见。有没有什么方法可以方便地为他们做到这一点?

可以使用 Rais 控制台来解决此问题。

cd /var/discourse
./launcher enter app
rails c

然后,您可以填写类别 slug用户名来遵循以下形式。
复制代码并将其粘贴到控制台中。

注意:

  • 它不会删除第一个帖子,以避免主题被删除
  • 如果您定位的是子类别,请提供父类别,例如:parent_cat_slug/cat_slug

:warning: 在进行任何更改之前,请务必进行备份。

Category
  .find_by_slug_path_with_id("=CATEGORY_SLUG=")
  .tap do |c|
    u = User.find_by_username("=USERNAME=")
    Post
      .joins(:topic)
      .where(user_id: u.id)
      .where("topics.category_id = ?", c.id)
      .where.not(post_number: 1)
      .where(deleted_at: nil)
      .find_each { |p| PostDestroyer.new(Discourse.system_user, p).destroy }
  end
1 个赞

谢谢!这太棒了。