La nostra community ha diverse migliaia di messaggi privati che sono stati inviati tra gli utenti. Esiste un modo per rimuovere completamente i messaggi privati con più di 100 risposte dal database (senza possibilità di recupero)?
Bene, penso che questo farà ciò che hai chiesto. Eliminerà tutti i messaggi privati che non sono stati creati da un utente di sistema o da discobot. Eliminerà comunque qualsiasi altro messaggio privato, inclusi quelli degli amministratori.
Non è stato testato. Non sto dicendo che sia una buona idea. Non posso garantire che non provochi danni.
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
Se non succede nulla di grave, puoi omettere gli ultimi due passaggi. Se invece succede qualcosa di negativo, dovrai copiare/incollare il backup più recente visualizzato dal comando discourse restore per ripristinare il backup.
Puoi rimuovere tutti i messaggi in una volta sola.
rake destroy:private_messages
Riferimento:
Ottimo lavoro, @IAmGav! Giuro che ho cercato lì e non l’ho visto.
Grazie Jay,
Eseguire direttamente sul database una query di eliminazione in batch è davvero spaventoso ![]()
Ho dato un’occhiata veloce al funzionamento di questa funzione. Come si è scoperto, dopo averla eseguita, tutti i messaggi privati verranno eliminati.
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
Penso di dover scegliere la via temibile indicata da @pfaffman per filtrare i messaggi. Oppure provare a definire una funzione rake personalizzata e utilizzare PostDestroyer.new(Discourse.system_user, first_post).destroy.
Ritornando su questo vecchio argomento, dato che nessuna delle risposte è corretta al 100%.
Il rake task rake destroy:private_messages non elimina definitivamente tutti i messaggi privati, li elimina in modo “soft”. Possono ancora essere visti da un amministratore e possono essere recuperati.
Il codice Rails Topic.where(archetype: 'private_message').where(\"user_id \u003e 0\").destroy_all elimina gli argomenti, ma non i messaggi effettivi. Sono ancora nel database e possono essere visualizzati utilizzando, ad esempio, il plugin data explorer.
Questo codice eliminerà definitivamente tutti i post e gli argomenti dei messaggi privati:
attenzione: coltello affilato qui!
Post.where(topic_id: Topic.where(archetype: 'private_message').where(\"user_id \u003e 0\")).destroy_all
Topic.where(archetype: 'private_message').where(\"user_id \u003e 0\").destroy_all
(e per filtrare questo su argomenti con 100 o più risposte è necessario estendere Topic.where con where(\"posts_count \u003e 100\") in entrambe le righe)