لأسباب تاريخية، قام مستورد Google+ الخاص بي باستيراد المستخدمين إلى TL1 لمنح اللاجئين من Google+ بداية جيدة. يتم استيرادهم بعناوين بريد إلكتروني .invalid، ونقوم بإصلاح ذلك عندما يسجلون الدخول ويرتبطون بسجل المستخدم الحالي الخاص بهم عن طريق معرف Google الخاص بهم من خلال مصادقة Google.
ولكن الآن، مجموعتي trust_level_1 مكتظة بآلاف المستخدمين الذين لم يتابعوا محتواهم بعد، وإذا ظهروا بعد بضع سنوات (كما يفعلون أحيانًا)، فلا يوجد سبب معين للدخول كمستخدمين أساسيين؛ يجب أن يكونوا مستخدمين جددًا. لقد تجاوزنا مرحلة التمهيد. أود تخفيض رتبة هؤلاء المستخدمين الذين لم يسجلوا الدخول مطلقًا إلى TL0 حتى يظهروا ويتصفحوا، والاعتماد فقط على عملية الترقية العادية.
لقد حاولت هذا في وحدة تحكم Rails:
User.where(trust_level: 1) do |u|
u.change_trust_level!(TrustLevel[0]) if !Email.is_valid?(u.primary_email&.email)
u.save!
end
استغرق الأمر دقائق واستهلك وحدة معالجة مركزية كاملة، لكنه لم يفعل شيئًا. (لقد جربت تنويعات أخرى في الطريق، مثل if !u.primary_email.is_valid? و if !Email.is_valid?(u.primary_email) وأعلم أن المشكلة الحقيقية هي أنني أتعامل مع Ruby مرة واحدة في السنة أو نحو ذلك…) أنا متأكد من أنني أغفل شيئًا واضحًا للآخرين. سأكون ممتنًا لتلميح إذا تمكن أي شخص من تقديمه!
User.where(trust_level: 1).each do |u|
u.change_trust_level!(TrustLevel[0]) if !Email.is_valid?(u.primary_email&.email)
u.save!
end
هذا أدى إلى تعطل موقعي أثناء تشغيله مع الكثير من عمليات الإدخال والإخراج ولم يُجرِ أي تغيير. لذا ما زلت أفعل شيئًا خاطئًا ولست قلقًا بعض الشيء بشأن مواصلة تجربة هذا على النظام المباشر.
لقد اكتشفت أن هذا ليس ما تعنيه is_valid؟. لذا أبحث الآن عن السلسلة الحرفية بدلاً من ذلك، واختبرت ذلك عن طريق طباعة عنوان البريد الإلكتروني. وأرى أيضًا أن change_trust_level يقوم بالفعل بحفظ المستخدم، لذلك لا أحتاج إلى القيام بذلك مرتين.
User.where(trust_level: 1).each do |u|
if u.primary_email&.email.end_with?(".invalid")
u.change_trust_level!(TrustLevel[0])
end
end
لكن عدد المستخدمين في trust_level_1 لا يزال لا يتغير، لذا ما زلت أفتقد شيئًا مهمًا.
هل يمكنك استخدام مهمة المسؤول بالجملة في هذه الحالة؟
على الرغم من أنني اختبرت الكود الثاني الخاص بك للتو وقد نجح معي على المستخدم التجريبي الخاص بي (البريد الإلكتروني: test_thirteen@here.invalid، كان TL1 وهو الآن TL0).
User.where(trust_level: 1).each do |u|
if u.primary_email&.email.end_with?(".invalid")
u.change_trust_level!(TrustLevel[0])
end
end
سأبدأ بنموذج UserEmail وأبحث عن تلك التي تحتوي على “invalid” في عنوان بريدهم الإلكتروني وأقوم بالمرور عليها، ولكن هذا ليس شيئًا يمكنني تحديده بالضبط على هاتفي.
إذا كانت تلك العناوين التي تحتوي على “invalid” غير صالحة بالفعل، فلن يتمكنوا من الحفظ.
لقد قمت بترقية بعض المستخدمين يدويًا الذين كانوا معروفين سابقًا لأعضاء المجتمع الحاليين، لذلك لن يؤدي إعادة الحساب المجمعة إلى تحقيق ما أريده. (لقد وجدت تلك الصفحة أثناء البحث.)
كان الأخير يعمل بالفعل، كما حدث معك. كانت مشكلتي هي أنني كنت أنظر إلى صفحة نظرة عامة على مجموعات /g وأقوم بتحديثها وأبحث عن انخفاض عدد مجموعة trust_level_1. لم تكن تعرض تغييرًا في العدد أثناء تشغيله، لذلك أوقفته باستخدام control-C. هذا الصباح، أصبحت مجموعة trust_level_1 الآن تحتوي على آلاف الأعضاء الأقل المعروضين في تلك الصفحة. لذلك أدركت الآن أن العدد هناك مخزن مؤقتًا، وكان يجب عليّ النقر على تلك البطاقة والنظر إلى العدد في صفحة /g/trust_level_1.
الآن أفهم أنه كان يجب عليّ المتابعة مع Group.ensure_consistency! لإصلاح الأعداد في تلك الصفحة.
إليك الأمر برمته، معبرًا عنه بشكل أكثر إيجازًا واصطلاحًا:
User.where(trust_level: 1).each do |u|
u.change_trust_level!(TrustLevel[0]) if u.primary_email&.email.end_with?(".invalid")
end
Group.ensure_consistency!
يصادف أن لدي سجلًا لعدد قليل من المستخدمين الذين لديهم فقط بريد إلكتروني غير صالح مع سجل لاستخدام الموقع بالفعل وتلبية متطلبات TL1. لا أعرف كيف حدث ذلك، ولكن في الوقت الحالي لا يهمني. كل ما يهمني حقًا هو الاعتناء بالكتلة الكبيرة من الآلاف، دون القلق بشأن الاستثناءات القليلة. إذا حدث هذا لأي شخص آخر، فقد نجح هذا بالنسبة لي:
User.where(trust_level: 1).each do |u|
begin
u.change_trust_level!(TrustLevel[0]) if u.primary_email&.email.end_with?(".invalid")
rescue
end
end
Group.ensure_consistency!
def import_google_user(id, name)
if !@emails[id].present?
google_user_info = UserAssociatedAccount.find_by(provider_name: 'google_oauth2', provider_u
id: id.to_i)
if google_user_info.nil?
# إنشاء مستخدم جوجل جديد في النظام؛ نتوقع أن يتم دمج هذا المستخدم
# عندما يسجل الدخول لاحقًا باستخدام مصادقة جوجل
# لاحظ أنه نظرًا لأن عنوان البريد الإلكتروني غير مدرج في بيانات G+، فإننا
# لا نعرف ما إذا كان لديهم بالفعل حساب آخر لم يتم ربطه بعد بـ
# مصادقة جوجل. إذا لم يسجلوا الدخول، فسيكون لديهم
# عنوان @gplus.invalid مرتبط بحسابهم
email = "#{id}@gplus.invalid"
هذا يعني أنني أهتم فقط بـ primary_email ولا أضطر إلى البدء بـ UserEmail. بدأت في هذا المسار قبل أن أدرك أن أي شيء يغير ذلك ليصبح ليس primary_email سيجعلني لا أرغب في تغييره على أي حال. لذا هنا، يتعلق الأمر تحديدًا بالمستخدمين الذين ينتهي عنوان بريدهم الإلكتروني الوحيد (وبالتالي الأساسي) حرفيًا بـ .invalid - وهذا ما فعلته.