أود حذف مستخدمين بشكل جماعي يتطابقون مع نمط بريد إلكتروني مثل:
*.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:
سيؤدي هذا إلى قيام المستخدم النظامي بحذف المستخدم وجميع منشوراته.
باختصار:
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
كن حذرًا من أن هذا الإجراء لا يمكن عكسه. قد ترغب في التحقق من المستخدمين الذين تم تحديدهم بواسطة الاستعلام قبل حذفهم فعليًا. كما أنني غير متأكد من تأثيرات الأداء إذا كنت تحذف عددًا كبيرًا من المستخدمين و/أو إذا كان لديهم عدد كبير من المنشورات.
مرحبًا @xrav3nz! هذا الرد رائع!
هذا بالضبط ما أحتاجه، سأجربه الآن، وقبل ذلك سأؤكد العدد باستخدام دالة count() البسيطة بالطبع كما اقترحت.
ملاحظة واحدة، ألا يجب أن يكون delete_post: true بدلاً من false؟
حالة الاستخدام لدي بسيطة جدًا: قمت باستيراد منتدى phpBB قديم (شكرًا لـ @gerhard) وعمل بشكل مثالي، لكن هذا المنتدى القديم كان ملوثًا تمامًا بحسابات وهمية.. لم ينشئوا أي رسائل. جميع عناوين البريد الإلكتروني تبدو مثل .fun أو .xyz.