Unsere Community hat mehrere tausend private Nachrichten, die zwischen Benutzern gesendet wurden. Gibt es eine Möglichkeit, private Nachrichten mit mehr als 100 Antworten vollständig aus der Datenbank zu entfernen (ohne Wiederherstellung)?
Nun, ich denke, das wird tun, was du verlangt hast. Es löscht alle privaten Nachrichten, die nicht von einem Systembenutzer oder Discobot erstellt wurden. Es löscht weiterhin alle anderen privaten Nachrichten, einschließlich solcher von Administratoren.
Es wurde nicht getestet. Ich sage nicht, dass es eine gute Idee ist. Ich verspreche nicht, dass nichts Schlechtes passiert.
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
Wenn nichts Schlechtes passiert, kannst du die letzten beiden Schritte weglassen. Wenn etwas Schlechtes passiert, möchtest du die neueste Sicherung kopieren/einfügen, die vom Befehl discourse restore ausgegeben wurde, um die Sicherung wiederherzustellen.
Du kannst alle Nachrichten auf einmal entfernen.
rake destroy:private_messages
Referenz:
Gute Arbeit, @IAmGav! Ich schwöre, ich habe dort geschaut und nichts gesehen.
Danke, Jay,
Eine Batch-Löschabfrage direkt auf der Datenbank auszuführen, ist wirklich beängstigend ![]()
Ich habe mir kurz angesehen, wie diese Funktion funktioniert. Wie sich herausstellt, werden nach der Ausführung alle privaten Nachrichten gelöscht.
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
Ich denke, ich muss den beängstigenden Weg wählen, den @pfaffman zur Filterung von Nachrichten aufgezeigt hat, oder versuchen, eine benutzerdefinierte Rake-Funktion zu definieren und PostDestroyer.new(Discourse.system_user, first_post).destroy zu verwenden.
Dieses alte Thema noch einmal aufgreifend, da keine der Antworten zu 100 % korrekt ist.
Die Rake-Aufgabe rake destroy:private_messages löscht private Nachrichten nicht endgültig, sondern weich. Sie können immer noch von einem Administrator eingesehen und wiederhergestellt werden.
Der Rails-Code Topic.where(archetype: 'private_message').where("user_id > 0").destroy_all löscht die Themen, aber nicht die eigentlichen Nachrichten. Sie befinden sich immer noch in der Datenbank und können beispielsweise mit dem Data Explorer Plugin eingesehen werden.
Dieser Code löscht alle privaten Nachrichtenbeiträge und -themen dauerhaft:
Warnung: scharfes Messer hier!
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
(und um dies auf Themen mit 100 oder mehr Antworten zu beschränken, müssen Sie Topic.where in beiden Zeilen um where("posts_count > 100") erweitern)