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

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 بديلًا مناسبًا لك؟