نعتذر إذا كانت هذه السؤالًا تافهاً…
لماذا لا يُمكن حذف الرسائل بسهولة من قاعدة البيانات في Discourse؟
يستخدم Discourse آلية تسمى ‘الحذف اللين’ (soft delete) مما يسهل تصحيح الأخطاء. كما يتيح التمييز بين ‘الحذف للمستخدمين الآخرين’ و’الحذف للمسؤولين’.
كما يحافظ على سلامة قاعدة البيانات. ماذا لو تم اقتباس منشور محذوف (قبل حذفه)؟ عندها سيكون المنشور الذي يحتوي على الاقتباس مرجعًا لمنشور لم يعد موجودًا. وهذا قد يؤدي إلى جميع أنواع الأخطاء.
شكرًا، فهمت الآن… المشكلة الوحيدة هي إذا كانت هناك رسائل محذوفة كثيرة.
تم مناقشة هذا الطلب سابقًا أكثر من مرة، على سبيل المثال:
في حين أنني أفهم أن الحذف الناعم قد يكون مفيدًا، إلا أنه بعد مرور فترة معينة (مثل أسبوع أو شهر)، سيكون من الرائع إزالة العناصر المحذوفة فعليًا لتوفير المساحة وضمان الامتثال القانوني، مثل حالات نشر محتوى غير قانوني أو الحاجة إلى إزالة البيانات الشخصية للامتثال للائحة العامة لحماية البيانات (GDPR).
الحاجة إلى تسجيل الدخول وتشغيل مهمة rake لاستبدال الرسالة بعبارة “تم حذف هذا” أمر غير مقنع بعض الشيء.
آه… عذراً، لقد اعتقدت أنه يمكن فعل ذلك قادمًا من phpBB.
تم تطبيقه الآن
أفضل،
لكن كيف نفعل ذلك؟
لقد جربت ذلك هذا الصباح، لكنني لم أستطع فهمه.
هل لديك أي توجيهات؟
حسنًا، يجب تعيين الإعداد في الإدارة > الإعدادات > الأمان (مخفي حاليًا لسبب ما)، ثم يجب منح كل مسؤول هذه الصلاحية مثل المراقب.
بعد المنح، ستظهر في قائمة إدارة المنشورات.
آه، قد يكون هذا هو العائق الذي أواجهه. كنت أبحث عن can_permanently_delete في إعدادات المسؤول ولم أستطع رؤيته.
تم إخفاء إعداد الموقع لأننا لا نشجع على استخدامه. تم تطويره للحالات التي يتم فيها نشر معلومات حساسة ويجب مسحها تمامًا من قاعدة البيانات. بالإضافة إلى ذلك، فإن هذه العملية ليست عملية جماعية على أي حال.
بما أنه إعداد موقع مخفي، فإن الطريقة الوحيدة لتمكينه هي عبر وحدة التحكم.
هذا مطابق تقريبًا لما أحتاجه! شكرًا لك.
كيف يمكنني كتابة الصيغة بحيث تغطي فقط جميع المنشورات المحذوفة قبل تاريخ xxxx؟
سيكون هذا هو Post.with_deleted.where("deleted_at < 'YYYY-mm-dd'").update_all(...)
هل يمكنك إخبارنا بكيفية تمكين ذلك من وحدة التحكم؟
إليك التعليمات:
الميزة مفعّلة من وحدة التحكم، ولكن كيف يمكنني حذف المنشورات المحذوفة؟ جميع المنشورات موجودة في قسم المنشورات المحذوفة.
لست خبيرًا في هذا الأمر حقًا، لكن يبدو أن هناك ما يكفي من مقتطفات معلوماتية في هذا الموضوع لإنشاء الكود الذي تبحث عنه.
الموضوع الذي ربطت به في البداية يحتوي على تحذيرات من المبدعين حول كونه منطقة غير مستكشفة، وأنك تقوم بذلك على مسؤوليتك الخاصة. لكنهم يقدمون أيضًا جزء ‘destroy_all’ الذي يبدو مفيدًا، ويوصون بالبدء بالدُفعات.
يحتوي هذا الموضوع أيضًا على مثالين حول كيفية استهداف المنشورات أو المواضيع، وهو ما (بالإضافة إلى الأمثلة التي قدمها @RGJ حول كيفية استهداف منشورات محددة مختلفة) يجب أن يقربك كثيرًا من الهدف.
مع ذلك، ليس لدي أي خبرة في هذا الأمر، لذا أخشى أنني لا أستطيع إعطاء الضوء الأخضر لأنني لم أقوم بذلك من قبل. ![]()
لحذف المنشورات القديمة في منتداك، استخدمت هذا الحل. وهو نتيجة دمج The proper way to completely delete hundred of topics via rails? مع اقتراحات @RGJ.
اخترت القيام بذلك في النهاية، لأنني كنت أرغب حقًا في إزالة البيانات من قاعدة البيانات لحماية خصوصية المستخدمين. فإعادة كتابة النص إلى “تم حذف هذا المنشور” تترك سجل التعديل سليماً ويمكن الوصول إليه بسهولة نسبيًا، لذا لم يكن ذلك كافيًا.
وبما أننا كنا نملك 20,000 موضوع يجب تدميره، فقد استغرق الأمر بعض الوقت!
Topic.with_deleted.where("deleted_at < '2021-08-28'").limit(1000).destroy_all
وبما أن هذا ترك العديد من المنشورات اليتيمة، فقد اضطررت إلى اتباعه بما يلي:
Post.where('topic_id not in (select id from topics)').limit(1000).destroy_all
أتخيل أن أمر ./launcher cleanup الذي نفّذته لاحقًا قد حرّر أيضًا بعض المساحة ![]()
للأسف، وعلى الرغم من أن الأمر تم تنفيذه كما هو متوقع، لا تزال جدول posts مليئًا بالمنشورات اليتيمة. تم تنظيف جدول topics بنجاح. لا يمكن الوصول إلى المنشورات عند محاولة زيارتها عبر /t/topic_id، ولكن هذا على الأرجح بسبب عدم وجود معرف موضوع (Topic ID) صالح. لا أفهم تمامًا سبب بقائها في الجدول رغم ذلك.
هل يمكن لأي شخص اقتراح طريقة أفضل لتنظيف جدول posts؟