Как удалить тысячи личных сообщений?

В нашем сообществе есть несколько тысяч личных сообщений, отправленных между пользователями. Можно ли полностью удалить из базы данных личные сообщения с более чем 100 ответами (без возможности восстановления)?

Что ж, думаю, это сделает то, что вы просили. Это удалит любые личные сообщения, которые не были созданы системным пользователем или discobot. При этом будут удалены и любые другие личные сообщения, включая сообщения от администраторов.

Это не протестировано. Я не утверждаю, что это хорошая идея. Я не обещаю, что это не приведёт к чему-то плохому.

cd /var/discourse
discourse backup
./launcher enter app
rails s
Topic.where(archetype: 'private_message').where("user_id > 0").destroy_all
exit
discourse enable_restore
discourse restore

Если ничего плохого не произойдёт, вы можете пропустить последние два шага. Если что-то пойдёт не так, вам нужно будет скопировать и вставить последнюю резервную копию, выведенную командой discourse restore, чтобы восстановить данные из резервной копии.

Вы можете удалить все сообщения сразу.

rake destroy:private_messages

Ссылка:

Отличная работа, @IAmGav! Клянусь, я там смотрел, но не увидел.

Спасибо, Джей,
Запуск запроса на массовое удаление напрямую в базе данных — это так страшно :sweat_smile:

Я бегло посмотрел, как работает эта функция. Оказывается, после её выполнения все личные сообщения будут удалены.

  def destroy_private_messages
    Topic.where(archetype: "private_message").find_each do |pm|
      @io.puts "Удаление #{pm.slug} pm"
      first_post = pm.ordered_posts.first
      @io.puts PostDestroyer.new(Discourse.system_user, first_post).destroy
    end
  end

Думаю, мне придётся выбрать пугающий способ, который указал @pfaffman, чтобы отфильтровать сообщения. Или же попробовать определить собственную rake-функцию и использовать PostDestroyer.new(Discourse.system_user, first_post).destroy.

Возвращаюсь к этой старой теме, так как ни один из ответов не является на 100% верным.

Задача Rake rake destroy:private_messages не выполняет жесткое удаление всех личных сообщений, а лишь помечает их как удаленные (soft delete). Их всё ещё может видеть администратор, и они могут быть восстановлены.

Код Rails Topic.where(archetype: 'private_message').where("user_id > 0").destroy_all удаляет темы, но не сами сообщения. Они всё ещё находятся в базе данных и могут быть просмотрены, например, с помощью плагина Data Explorer.

Этот код действительно навсегда удалит все посты и темы личных сообщений:
внимание: острый нож!

Post.where(topic_id: Topic.where(archetype: 'private_message').where("user_id > 0")).destroy_all
Topic.where(archetype: 'private_message').where("user_id > 0").destroy_all

(чтобы отфильтровать темы с 100 и более ответами, необходимо добавить условие where("posts_count > 100") к Topic.where в обеих строках)