Как массово удалить старые whispers

Продолжение обсуждения из Административные массовые операции:

Я ищу способ удалить секретные сообщения старше определённого возраста из всех тем.

Как правило, мы используем секретные сообщения для обсуждения потенциальных действий модераторов, но после того как действие было предпринято, эти сообщения теряют свою полезность и со временем всё больше превращаются в информационный шум.

Я мог бы удалить сообщения старше определённого возраста с post_type=4 (секретное сообщение), но это может привести к «висячим» или некорректным данным в базе данных, либо быть запрещено из-за ограничений ключей форума.

Существует ли безопасный способ сделать это?

Это самый чистый способ удалить посты:

whispers = Post.where(post_type: 4).where("created_at < ?", 1.year.ago)

whispers.find_each do |w|
  PostDestroyer.new(Discourse.system_user, w, skip_staff_log: true).destroy
  putc "."
end

Это фактически имитирует удаление каждого поста вручную пользователем System с помощью кнопки удаления. Я добавил параметр skip_staff_log, чтобы не засорять логи сотрудников, но вы можете убрать его, если хотите, чтобы действие было зафиксировано в логах.

Как вы думаете, это решит вашу задачу?

Думаю, это выглядит идеально — спасибо!

Попробую на тестовом экземпляре и посмотрю, сколько времени это займёт, ведь у нас, наверное, несколько тысяч «шепотов»!!!

Итак, эта задача работает хорошо, спасибо… но шепоты просто сворачиваются и всё ещё видны администраторам и модераторам при раскрытии.

Это действительно упорядочивает темы, но я надеялся, что их можно будет полностью удалить. Я подумывал о том, чтобы переместить все шепоты в новую тему, а затем удалить её или скрыть хотя бы от модераторов, но потом я нашёл это: Is there a way to remove all the deleted/hidden posts? и, что более актуально, это: Why is it not possible to permanently delete topics or posts?

К сожалению, вышеупомянутые обсуждения говорят о том, что полностью удалить данные невозможно :frowning: