سحب شارة المستوى الأدنى عند تحقيق شارة أعلى؟

كيفية استثناء الحقوق لشارة مخصصة إذا تم منح مستوى أعلى بالفعل؟ الهدف هو منح أعلى مستوى فقط مؤهل له مستخدم معين…

لنفترض أن لدي 3 شارات:

المستوى 1: 5 إعجابات تم تقديمها، 5 تم استلامها
المستوى 2: 100 إعجاب تم تقديمها، 100 تم استلامها
المستوى 3: 250 إعجاب تم تقديمها، 250 تم استلامها

الكود أدناه للمستوى 2. المستويات الأخرى ليس بها أي اختلاف بخلاف الرقم ‘100’

SELECT us.user_id, current_timestamp AS granted_at 
FROM user_stats AS us
WHERE us.likes_received >= 100 
AND us.likes_given >= 100
AND (:backfill OR us.user_id IN (:user_ids))
إعجاب واحد (1)

في إعدادات /admin/badges/BADGE-ID، ما عليك سوى تحديد الخيار Run revocation query daily. سيتم إزالة الشارة إذا لم تعد تستوفي معايير SQL.

قد ترغب أيضًا في جعلها Update Daily أيضًا حتى تحدث المنح / الإلغاء في نفس الوقت تقريبًا (منتصف الليل بالتوقيت المحلي لمثيلك أعتقد).

3 إعجابات

شكراً لك يا ناثان. سألقي نظرة.

إعجاب واحد (1)

هل هذا يحتاج أيضًا إلى سطر إضافي في قاعدة بيانات شارات SQL لموازنته؟ شيء مثل:

SELECT us.user_id, current_timestamp AS granted_at 
FROM user_stats AS us
WHERE us.likes_received >= 100 
AND us.likes_given >= 100
AND us.likes_given < 250
AND (:backfill OR us.user_id IN (:user_ids))

(ربما استخدام BETWEEN أو ما شابه، على الرغم من أنني لم أختبر ذلك بعد :slight_smile:)

وبعد ذلك، عندما يتم تشغيل الاستعلام، سيمنح الشارة لـ 100 إعجاب في المرة الأولى، ويتجاهلها من 101 إلى 249، ثم يلغيها عند 250 (حيث ستستلم الشارة التالية من).


تحديث: لقد تدربت قليلاً على BETWEEN، ويبدو أن شيئًا مثل هذا يلتقط جميع الأشخاص المناسبين في الاختبار التجريبي:

SELECT us.user_id
FROM user_stats AS us
WHERE us.likes_received BETWEEN 100 AND 249 
ORDER BY us.likes_received DESC

لذا، يجب أن يعمل شيء مثل هذا إذا تم تحويله إلى شارة مشغلة:

SELECT us.user_id, current_timestamp AS granted_at 
FROM user_stats AS us
WHERE us.likes_received BETWEEN 100 AND 249
AND us.likes_given BETWEEN 100 AND 249
AND (:backfill OR us.user_id IN (:user_ids))
3 إعجابات

هذا مثالي تقريبًا. قد يحدث حدث نادر: يقوم المستخدم بتسليم الكثير في “المعطى” بينما يتأخر في “المستلم” (أو العكس)، لذلك يمكن فقدان الشارة قبل منح الشارة التالية (روتين الإلغاء).

بحثت واكتشفت خاصية مثيرة للاهتمام: something.badge_id = 123 حيث “something” هو المتغير المعرف من قبل المستخدم و “123” هو معرف شارة أخرى. سأجرب وأكمل استعلامات SQL الأصلية للمستوى 1 والمستوى 2 بفحوصات استبعاد ضد شارات المستوى الأعلى.

إعجابَين (2)

هذه نقطة مثيرة للاهتمام للغاية لم أفكر فيها. :slightly_smiling_face: الطبيعة المزدوجة تجعل الأمر أكثر صعوبة قليلاً. :thinking:

أحب فكرة بناء فحص ضد الشارات الأخرى، يمكن أن يكون ذلك مفيدًا.

إعجاب واحد (1)