Nuestra comunidad tiene varios miles de mensajes privados que se han enviado entre usuarios. ¿Hay alguna forma de eliminar por completo los mensajes privados con más de 100 respuestas de la base de datos (sin posibilidad de recuperación)?
Bueno, creo que esto hará lo que pediste. Eliminará cualquier mensaje privado que no haya sido creado por un usuario del sistema o discobot. Sin embargo, seguirá eliminando cualquier otro mensaje privado, incluidos los de los administradores.
No está probado. No digo que sea una buena idea. No prometo que no hará algo malo.
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
Si no ocurre nada malo, puedes omitir los últimos dos pasos. Si ocurre algo malo, querrás copiar y pegar la copia de seguridad más reciente mostrada por el comando discourse restore para restaurar la copia de seguridad.
Puedes eliminar todos los mensajes de una sola vez.
rake destroy:private_messages
Referencia:
¡Buen trabajo, @IAmGav! Juro que busqué allí y no lo vi.
Gracias, Jay,
Ejecutar una consulta de eliminación por lotes directamente en la base de datos da mucho miedo ![]()
He echado un vistazo rápido a cómo funciona esta función. Resulta que, tras ejecutarla, se eliminarán todos los mensajes privados.
def destroy_private_messages
Topic.where(archetype: "private_message").find_each do |pm|
@io.puts "Destruyendo #{pm.slug} pm"
first_post = pm.ordered_posts.first
@io.puts PostDestroyer.new(Discourse.system_user, first_post).destroy
end
end
Creo que tendré que optar por la forma arriesgada que señaló @pfaffman para filtrar los mensajes, o bien intentar definir una función personalizada de rake y utilizar PostDestroyer.new(Discourse.system_user, first_post).destroy.
Revisando este antiguo tema, ya que ninguna de las respuestas es 100% correcta.
La tarea rake rake destroy:private_messages no elimina permanentemente todos los mensajes privados, los elimina lógicamente. Todavía pueden ser vistos por un administrador y pueden ser recuperados.
El código de Rails Topic.where(archetype: 'private_message').where("user_id > 0").destroy_all destruye los temas, pero no los mensajes reales. Todavía están en la base de datos y se pueden ver usando, por ejemplo, el plugin explorador de datos.
Este código eliminará permanentemente todas las publicaciones y temas de mensajes privados:
advertencia: ¡cuchillo afilado aquí!
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
(y para filtrar esto en temas con 100 respuestas o más, necesitas extender Topic.where con where("posts_count > 100") en ambas líneas)