حذف المستخدمين بالجملة الذين يطابقون نمط بريد إلكتروني معين

أود حذف مستخدمين بشكل جماعي يتطابقون مع نمط بريد إلكتروني مثل:

  • *.xyz
  • *.fun
  • إلخ..

لقد جربت ما يلي حتى الآن: User.find(UserEmail.where("email like '%.fun'").pluck(:user_id)).count. لكن لا يمكنني استخدام دالة destroy_all بعد .where()

هل يمكنك مساعدتي من فضلك؟
شكرًا جزيلاً.

أود أن أفعل الشيء نفسه، بالإضافة إلى حذف جميع منشورات/مواضيع هؤلاء المستخدمين أيضًا.

User.joins(:user_emails)
  .where('lower(user_emails.email) LIKE ?', '%domain.com')

على وجه التحديد، علامة النسبة المئوية (%) هي حرف عام يمثل صفرًا أو أكثر من أي حرف. لذا فإن %domain.com تعني عناوين البريد الإلكتروني التي تنتهي بـ domain.com.

بدلاً من استخدام User#destroy، يُفضل استخدام UserDestroyer:

UserDestroyer.new(Discourse.system_user)
  .destroy(user, delete_posts: true)

سيؤدي هذا إلى قيام المستخدم النظامي بحذف المستخدم وجميع منشوراته.

باختصار:

User.joins(:user_emails)
  .where('lower(user_emails.email) LIKE ?', '%domain.com')
  .find_each do |user|
    UserDestroyer.new(Discourse.system_user).destroy(user, delete_posts: true)
  end

كن حذرًا من أن هذا الإجراء لا يمكن عكسه. قد ترغب في التحقق من المستخدمين الذين تم تحديدهم بواسطة الاستعلام قبل حذفهم فعليًا. كما أنني غير متأكد من تأثيرات الأداء إذا كنت تحذف عددًا كبيرًا من المستخدمين و/أو إذا كان لديهم عدد كبير من المنشورات.

من ناحية أخرى، لست متأكدًا مما إذا كان Anonymizing Users in Discourse بديلًا مناسبًا لك؟

مرحبًا @xrav3nz! هذا الرد رائع! :open_mouth:
هذا بالضبط ما أحتاجه، سأجربه الآن، وقبل ذلك سأؤكد العدد باستخدام دالة count() البسيطة بالطبع كما اقترحت.

ملاحظة واحدة، ألا يجب أن يكون delete_post: true بدلاً من false؟

حالة الاستخدام لدي بسيطة جدًا: قمت باستيراد منتدى phpBB قديم (شكرًا لـ @gerhard) وعمل بشكل مثالي، لكن هذا المنتدى القديم كان ملوثًا تمامًا بحسابات وهمية.. لم ينشئوا أي رسائل. جميع عناوين البريد الإلكتروني تبدو مثل .fun أو .xyz.

نعم، أنت محق! خطأ مطبعي من جانبي!