Извините, если это глупый вопрос… Почему в Discourse невозможно легко удалить сообщения из базы данных?
Discourse использует механизм, называемый «мягким удалением», который позволяет легко исправлять ошибки. Он также даёт возможность различать «удалённое для обычных пользователей» и «удалённое для администраторов».
Кроме того, это обеспечивает целостность базы данных. Что произойдёт, если удалённое сообщение было процитировано (до его удаления)? Тогда цитирующее сообщение будет содержать ссылку на сообщение, которое больше не существует. Это может привести к самым разным ошибкам.
Спасибо, теперь я понял… единственная проблема в том, что если удалено много сообщений.
Это уже обсуждалось и запрашивалось ранее, и не один раз, например:
Хотя я понимаю, что мягкое удаление может быть полезным, через определённый период (например, неделю или месяц) было бы неплохо, если бы удалённые данные действительно удалялись, чтобы освободить место и обеспечить соблюдение законодательства, например, если был опубликован незаконный контент или необходимо удалить личные данные в соответствии с GDPR.
Необходимость входить в систему и запускать rake-задачу для замены сообщения на «это было удалено» выглядит немного неуклюже.
Ой… извините, я думал, что это можно сделать, так как привык к phpBB.
Теперь это реализовано
С наилучшими пожеланиями,
Но как мы это сделаем???
Я игрался с этим сегодня утром, но так и не разобрался.
Есть какие-нибудь советы?
Чтобы изменить эту настройку, нужно перейти в Администрирование > Настройки > Безопасность (в данный момент она скрыта по какой-то причине), а затем предоставить соответствующее право каждому администратору, как для модератора.
После предоставления права эта опция появится в меню администрирования поста.
Ах, возможно, это и есть моя проблема. Я искал can_permanently_delete в настройках администратора, но не мог его найти.
Настройка сайта скрыта, так как мы не рекомендуем её использовать. Она была разработана для случаев, когда в базу данных была размещена конфиденциальная информация, которую необходимо полностью удалить. Кроме того, эта операция не является пакетной.
Поскольку это скрытая настройка сайта, включить её можно только через консоль.
Это почти в точности то, что мне нужно! Спасибо.
Как правильно написать синтаксис, чтобы это касалось только всех постов, удаленных до даты xxxx?
Это будет Post.with_deleted.where("deleted_at < 'YYYY-mm-dd'").update_all(...)
Не могли бы вы сообщить, как включить это из консоли?
Вот инструкция:
Функция включена через консоль, но как удалить удалённые сообщения? Все сообщения присутствуют в удалённых сообщениях.
Я действительно не эксперт в этом, но, похоже, в этой теме достаточно фрагментов информации, чтобы создать код, который вы ищете.
В теме, на которую я ссылался в начале, создатели предупреждают, что это неизведанная территория, и вы действуете на свой страх и риск. Однако они также предоставляют фрагмент ‘destroy_all’, который кажется полезным, и предлагают начинать с пакетной обработки.
В той же теме есть несколько примеров того, как нацеливаться на сообщения или темы, что (в сочетании с примерами от @RGJ о том, как нацеливаться на конкретные сообщения) должно приблизить вас к цели.
У меня, однако, нет опыта в этом, поэтому, боюсь, я не могу дать добро, так как сам этого никогда не делал. ![]()
Чтобы удалить старые посты на нашем форуме, я использовал этот подход. Он основан на комбинации The proper way to completely delete hundred of topics via rails? и предложений от @RGJ.
В итоге я выбрал именно этот метод, так как хотел полностью удалить данные из базы данных для защиты конфиденциальности пользователей. Замена текста на «Этот пост был удалён» не подходит, поскольку история редактирования остаётся нетронутой и относительно легко доступной.
Поскольку нам нужно было удалить 20 000 тем, процесс занял некоторое время!
Topic.with_deleted.where("deleted_at < '2021-08-28'").limit(1000).destroy_all
Так как после этого осталось много «сиротских» постов, мне пришлось выполнить следующее:
Post.where('topic_id not in (select id from topics)').limit(1000).destroy_all
Предполагаю, что после этого ваша команда ./launcher cleanup также освободила место ![]()
К сожалению, несмотря на то, что запрос выполнился как ожидалось, таблица posts всё ещё полна сиротских сообщений. Таблица topics была очищена корректно. Сообщения недоступны при попытке перейти к ним по адресу /t/topic_id, но это, вероятно, связано с отсутствием валидного ID темы. Однако я не до конца понимаю, почему они всё ещё остаются в таблице.
Может ли кто-нибудь предложить лучший способ очистки таблицы posts?