Excluindo todas as mensagens de um usuário em uma categoria

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 curtida

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 curtida

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

Hopefully that can provide some inspiration?

Desculpe pelo necro, fico feliz em criar uma nova postagem se necessário.

Temos uma categoria de política e alguns usuários gostariam de deletar todas as suas postagens desta categoria por razões óbvias. Existe alguma maneira fácil de fazer isso para eles?

Uma solução pode ser usar o console do Rails.

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

Em seguida, você pode seguir o seguinte formulário preenchendo o slug da categoria e o nome de usuário.
Você copia o código e cola no console.

Observação:

  • Ele não exclui a primeira postagem para evitar que o tópico seja excluído
  • Se você tiver como alvo uma subcategoria, forneça o pai, por exemplo: slug_pai/slug_categoria.

:warning: Faça um backup antes de fazer qualquer alteração.

[wrap=placeholder key=CATEGORY_SLUG description="Slug da categoria"][/wrap]
[wrap=placeholder key=USERNAME description="Nome de usuário"][/wrap]

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 curtida

Obrigado! Isso é fantástico.