Удаление всех сообщений от пользователя в категории

Привет, ребята,

Недавно у меня возникла необходимость удалить все сообщения пользователя в конкретной категории. Оставив в стороне «споры» о удалении контента, я подумал: «О, это просто, использую поиск, отмечу все результаты галочками и удалю их».

Однако, похоже, что таким способом я удаляю темы, а не сами сообщения, хотя поиск выдаёт мне именно сообщения в результатах, а не обязательно темы (хотя они там тоже есть, да).

Есть ли «безопасный» способ сделать это? Сначала я думал, что это будет что-то очень экстремальное с базой данных (и я не исключаю такой возможности), но раз я могу массово удалять 50+ тем через интерфейс… может, есть способ сделать то же самое только для сообщений? (Или способ через консоль, просто не хочу «попытаться» и взорвать базу данных :P)

Спасибо!

У меня нет личного опыта работы с этим, но, насколько я знаю, через API можно выполнить «мягкое» удаление —

Также есть несколько тем о «жёстком» удалении, если поискать по запросу «rails delete post».

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

Привет, @JammyDodger!

Спасибо за ссылки.

Я просто хочу удалить все сообщения от конкретного пользователя в определённой категории. :stuck_out_tongue:

P.S.: Может быть, использовать консоль? Я просто не хочу уничтожать мою базу данных…

В этой теме идёт обсуждение чего-то подобного: Delete deleted-posts permanently in bulk?

Надеюсь, это может дать некоторые идеи?

Извините за воскрешение старой темы, готов создать новую, если это необходимо.

У нас есть категория «Политика», и некоторые пользователи хотели бы удалить все свои сообщения в этой категории по понятным причинам. Есть ли способ легко сделать это для них?

Одно из решений — использование консоли Discourse.

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

Затем вы можете следовать приведённому ниже шаблону, заполнив слаг категории и имя пользователя.
Скопируйте код и вставьте его в консоль.

Примечание:

  • Первый пост не удаляется, чтобы избежать удаления темы.
  • Если вы работаете с подкатегорией, укажите родительскую категорию, например: slug_родителя/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

Спасибо! Это фантастика.