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

Olá, pessoal,

Recentemente, precisei excluir todas as postagens de um usuário em uma categoria específica. Deixando de lado os “debates” sobre a exclusão de conteúdo, pensei: “Ah, fácil, basta usar a busca, selecionar todos os resultados com as caixas de seleção e excluí-los”.

No entanto, parece que ao fazer isso consigo excluir os tópicos e não tanto as mensagens, mesmo que a busca esteja retornando as mensagens como resultados, e não necessariamente os tópicos (embora eles também apareçam, sim).

Existe uma maneira “segura” de fazer isso? No início, achei que seria algo muito extremo para o banco de dados (e não descarto essa possibilidade), mas como consigo excluir em lote mais de 50 tópicos pela interface… talvez exista uma maneira de fazer isso apenas para as mensagens? (Ou uma maneira usando o console, só não quero “tentar” e explodir o banco de dados :P)

Obrigado!

1 curtida

Não tenho experiência pessoal com isso, mas acredito que é possível fazer uma exclusão “suave” usando a API —

E há alguns tópicos sobre exclusão “definitiva” se você pesquisar por ‘rails delete post’.

Se puder fornecer mais detalhes sobre o que está tentando alcançar, as pessoas podem dar dicas mais específicas.

Oi @JammyDodger

Obrigado pelos links.

Eu só quero excluir todas as mensagens de um usuário em uma categoria específica. :stuck_out_tongue:

PD: Talvez usando o Console? Só não quero destruir meu banco de dados…

1 curtida

Há uma discussão em andamento sobre algo semelhante neste tópico: Delete deleted-posts permanently in bulk?

Esperamos que isso possa oferecer alguma inspiração?

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.