كيفية حذف آلاف الرسائل الشخصية؟

لدى مجتمعنا عدة آلاف من الرسائل الخاصة التي تم إرسالها بين المستخدمين. هل هناك طريقة لإزالة الرسائل الخاصة التي تحتوي على أكثر من 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! أقسم أنني نظرت هناك ولم أره.

شكرًا لك جاي،
تشغيل استعلام حذف دفعة مباشرة على قاعدة البيانات أمر مخيف للغاية :sweat_smile:

لقد ألقيت نظرة سريعة على كيفية عمل هذه الدالة. كما اتضح، بعد تشغيلها، سيتم حذف جميع الرسائل الخاصة.

  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 لتصفية الرسائل. أو ربما أحاول تعريف وظيفة rake مخصصة واستخدام PostDestroyer.new(Discourse.system_user, first_post).destroy

إعادة النظر في هذا الموضوع القديم، حيث أن أياً من الإجابات ليست صحيحة بنسبة 100٪.

مهمة rake rake destroy:private_messages لا تقوم بحذف الرسائل الخاصة بشكل دائم، بل تقوم بحذفها بشكل ناعم. لا يزال بإمكان المسؤول رؤيتها ويمكن استعادتها.

الكود 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 رد أو أكثر، تحتاج إلى توسيع Topic.where باستخدام where("posts_count > 100") في كلا السطرين)