우리 커뮤니티에는 사용자들 사이에 전송된 수천 개의 개인 메시지가 있습니다. 답글이 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! 정말 거기를 봤는데 못 봤어요.
제이, 감사합니다.
데이터베이스에서 배치 삭제 쿼리를 직접 실행하는 것은 정말 무섭습니다 ![]()
이 함수가 어떻게 작동하는지 잠시 살펴봤습니다. 알고 보니 실행 후 모든 개인 메시지가 삭제됩니다.
def destroy_private_messages
Topic.where(archetype: "private_message").find_each do |pm|
@io.puts "Destroying #{pm.slug} pm"
first_post = pm.ordered_posts.first
@io.puts PostDestroyer.new(Discourse.system_user, first_post).destroy
end
end
메시지를 필터링하기 위해 @pfaffman이 지적한 위험한 방식을 선택하거나, PostDestroyer.new(Discourse.system_user, first_post).destroy를 사용하는 커스텀 rake 함수를 정의해 보는 것이 좋을 것 같습니다.
100% 정확한 답변이 없어서 이 오래된 주제를 다시 꺼내 봅니다.
rake destroy:private_messages rake 작업은 모든 개인 메시지를 하드 삭제하지 않으며, 소프트 삭제만 수행합니다. 관리자가 여전히 이를 볼 수 있고 복구도 가능합니다.
Rails 코드 Topic.where(archetype: 'private_message').where("user_id > 0").destroy_all은 토픽은 삭제하지만 실제 메시지는 삭제하지 않습니다. 메시지는 여전히 데이터베이스에 남아 있으며, 예를 들어 데이터 탐색기 플러그인을 사용하여 볼 수 있습니다.
다음 코드는 모든 개인 메시지 게시물과 토픽을 영구적으로 삭제합니다:
주의: 매우 위험한 작업입니다!
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에 추가해야 합니다)