شارة فضية مقابل كل 5 شارات برونزية

لقد أنشأنا شارة برونزية، مستخدمون يساعدون مستخدمين، للأشخاص الذين يحاولون مساعدة المستخدمين الآخرين. يتم منحها يدويًا (لتحديد الفرق بين محاولات المساعدة و “أنا أيضًا”).

لكل 5 شارات برونزية، نريد منح شارة فضية، لا تقدر بثمن.

يحدد استعلام SQL الذي توصلت إليه المستخدمين الصحيحين، ولكن مرة واحدة لكل منهما فقط:

SELECT user_id, current_timestamp AS granted_at 
FROM user_badges
WHERE badge_id = 110 -- مستخدمون يساعدون مستخدمين
    AND (:backfill OR user_id IN (:user_ids))
GROUP BY user_id
HAVING COUNT(*) >= 5

هل فاتني بعض السحر :magic_wand: في استعلام SQL الخاص بي، أم أن المضاعف يحدث خارج استعلام SQL؟

أيضًا، ليس من الواضح لي كيف تحدث العملية الحسابية بحيث لا يحصل مستخدمي على شارات جديدة كل يوم (سيتم تشغيل هذا عند تشغيل ليلي) حتى لو لم يحصلوا على 5 شارات برونزية جديدة.

هل هناك دليل لهذا لم أجده في بحثي؟

حسنًا، أدت عمليات بحث أعمق إلى اكتشاف دليل قادني إلى الدليل

لا يزال موضوع الملء الاحتياطي غامضًا بعض الشيء، لكنني قررت (بالطبع!) تجربة هذا على نسختنا التجريبية. أفترض أن الملء الاحتياطي يعمل ليلاً، لذلك سأعرف المزيد غدًا.

ما لم تحدد “يمكن منحها عدة مرات” فلن تُمنح إلا مرة واحدة، حتى لو استوفوا شروطها للمرة الثانية (أو أكثر). :+1:


حسنًا، لقد أعدت قراءة مشاركتك بشكل أكثر تفصيلاً وأعتقد أن لدي فكرة أوضح عما تهدف إليه.

بناءً على استعلام SQL الحالي، سيتم منح هؤلاء المستخدمين الشارة الفضية مرة واحدة فقط، حتى لو سمحت بمنحها عدة مرات:

  • لقد أنشأت الشارات ذات الصلة على موقع الاختبار الخاص بي (بما في ذلك السماح بمنحها عدة مرات)
  • منحت 5 شارات برونزية وقمت بتشغيل المهمة الخلفية لمنح الشارة (تم منح الشارة الفضية بنجاح :partying_face:)
  • ثم قمت بتشغيل مهمة BadgeGrant مرة أخرى ولم يتم منحهم الشارة الفضية للمرة الثانية
  • ثم قمت بزيادة عدد شاراتهم البرونزية إلى 11 وقمت بتشغيل مهمة منح الشارة مرة أخرى
  • لم يتم منح شارة فضية ثانية

لقد تحققت ‘عدة مرات’

ولكن تم منحه مرة واحدة فقط، على الرغم من أنه كان يجب أن يكون مرتين

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

إذًا… ما الذي يجب أن أفعله لأحصل على وسامين فضيتين يستحقهما مستخدمي الذي حصل على 12 وسامًا برونزيًا؟

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

هذا سؤال جيد لا أعرف إجابته على الفور. :slight_smile:

أفكر مبدئيًا في استخدام RANK ولكني قد أكون متمسكًا بالقش… :thinking:


نموذج أولي تقريبي...
WITH badge_count AS (

    SELECT 
        user_id,
        granted_at,
        RANK() OVER (PARTITION BY user_id ORDER BY granted_at ASC) AS rank
    FROM user_badges
    WHERE badge_id = 110

)

SELECT user_id, granted_at
FROM badge_count
WHERE rank IN (5,10,15,20,25,30,35,40,45,50)

حسنًا، محاولة ثانية باستخدام ROW_NUMBER بدلاً من ذلك:

WITH badge_count AS (

    SELECT 
        user_id,
        granted_at,
        ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY granted_at ASC) AS row
    FROM user_badges
    WHERE badge_id = 110

)

SELECT user_id, granted_at
FROM badge_count
WHERE row % 5 = 0

على الرغم من ذلك، عند إجراء المزيد من الاختبارات، يعمل هذا بشكل صحيح في المعاينة ولكنه لا يُمنح عدة مرات عند تشغيل مهمة badge grant الفعلية. لست متأكدًا حقًا من السبب. :thinking:

لقد أربكت نفسي. سأشرب كوبًا من الشاي وأعيد التجمع. :slight_smile:

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

حسنًا… لقد أعطيت المستخدم الخاص بي 4 برونزيات أخرى أمس لأرى ما إذا كان التشغيل الليلي سيضيف على الأقل الشارة الجديدة التي “اكتسبها” للتو. (اعتقدت أنه إذا كان عليّ اللحاق بالبقية يدويًا، فيمكنني ذلك.) لكن حتى ذلك لم ينجح.

لا يمكنني مساعدتك في الاستعلام، ولكن أقترح عليك أن تطلب المساعدة من روبوت Discourse AI - حدد أيقونة الروبوت في الأعلى
image → GPT-4 → مساعد SQL.

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

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

ليس لدى الجميع ذلك، توني :shushing_face: ستجعل الناس يشعرون بالغيرة. :slight_smile: (على الرغم من أن @ganncamp لديه، لذا فهو خيار)

لكن… أنا متأكد تمامًا من أن استعلامي سليم. إنه يختار الصحيحين في المعاينة، ولكنه لا يمنح أكثر من واحد عند استخدام مشغل “التحديث اليومي”.

لقد قمت بإعداد واحد آخر مطابق تقريبًا لاختباره بناءً على شارة “كل 5 مشاركات في موضوع معين” باستخدام مشغل “عندما ينشئ مستخدم أو يعدل منشورًا” - وهذا يعمل بشكل مثالي. أنا أتحرى عن سبب الاختلاف المحتمل…

إليك استعلام SQL لشارة الاختبار هذه للمقارنة إذا تمكن أي شخص من ملاحظة أي شيء:

WITH post_count AS (

    SELECT
        user_id,
        id,
        created_at,
        ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at ASC) AS row
    FROM posts
    WHERE topic_id = 864

)

SELECT user_id, created_at granted_at, id post_id
FROM post_count
WHERE row % 5 = 0
  AND (:backfill OR id IN (:post_ids))

إعجابَين (2)

لدي وصول إليه @tpetrov ولكن محاولاتي لاستخدامه كانت… أقل من مثمرة. أو ربما أتفوق فقط في طرح الأسئلة الصعبة؟ :laughing:

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

بعد القليل من الاستكشاف والتشاور، يبدو أن مانح الشارات التلقائي سيمنح شارات متعددة فقط إذا كانت تستند إلى مشاركات محددة. لذلك، هذه الأنواع ستمنح الشارة الأولى فقط (المعاينة مضللة :frowning:).

أعتقد أنه في حالات مماثلة، يمكن أن تعمل الشارات “المتصاعدة” بشكل جيد (مثل شارات تم الحل). لذا، فضية لـ 30 وذهبية لـ 100، على سبيل المثال، إذا كان هذا يمكن أن يكون بديلاً قابلاً للتطبيق؟

إذًا… على الرغم من أن الشارات البرونزية تُمنح بناءً على المشاركات… فهذا لا يُحتسب، أليس كذلك؟

لا أعرف. لا أعتقد أنني أفهم السؤال. :ضحك:

أعتقد أن الاقتراح ليس العثور على 5 شارات، بل 5 مشاركات تم فيها منح شارة؟ يمكنني فعل ذلك. لقد فعلت ذلك بالفعل تقريبًا في تقريري “العثور على مشاركات جديدة لمنح شارات لها”.

حسنًا. :thinking: أعتقد أنني أفهم ما تقصده. دعني أحاول مرة أخرى…


@ganncamp - أعتقد أننا قد نحقق بعض النجاح… :slight_smile:

بناءً على منح شارة البرونزية A من خلال مفتاح الربط المنشور أو عن طريق تقديم سبب في صفحة /admin/users/{user_id}/{username}/badges:

إذًا أعتقد أن هذا ممكن بالفعل. :partying_face:

WITH badge_count AS (

    SELECT 
        user_id,
        granted_at,
        post_id,
        ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY granted_at DESC) AS row
    FROM user_badges
    WHERE badge_id = 110
      AND post_id IS NOT NULL
)

SELECT user_id, granted_at, post_id
FROM badge_count
WHERE row % 5 = 0
  AND (:backfill OR post_id IN (:post_ids))

(إضافة AND post_id IS NOT NULL يحميها من إذا مُنح شخص ما واحدة بدون سبب، وإلا فإنها ستتعطل)

لقد جربت ذلك للتو وقمت بتسريع الأمور عن طريق تشغيل مهمة الخلفية GrantBadge وحصل مستخدم الاختبار الخاص بي أخيرًا على التقدير الكامل الذي يستحقه. :slight_smile:

ثم منحته 5 شارات A إضافية لخمسة منشورات مختلفة وقمت بتشغيله مرة أخرى: :tada:

3 إعجابات

شكراً @JammyDodger! :tada: :tada: :tada:

لقد قمت بإعداد هذا على نسختي التجريبية (ليس أنني لا أثق بك :joy:) وآمل أن أضع هذا في الإنتاج هذا الأسبوع! :star_struck:

وهل هذا وقت جيد للسؤال عن تحديث البرنامج التعليمي بالأشياء التي تعلمتها في هذه المهمة؟ :smiley:

بالتأكيد. الثقة، ولكن التحقق هو بالتأكيد خيار ذكي. :slight_smile:

سأرى ما إذا كان بإمكاني إضافة شيء صغير. :slight_smile: :+1:

إعجابَين (2)

حسنًا… عندما تم تشغيل المهمة ليلاً،
حصل مستخدمي الذي لديه 6 برونزيات على فضية واحدة :white_check_mark:
حصل مستخدمي الذي لديه 13 برونزية على… فضية واحدة :slightly_frowning_face:

هذا الجزء في البرنامج التعليمي جعلني أعتقد أن مهمة تعبئة خلفية منفصلة وصريحة لم تكن ضرورية

نظرًا لأن التعبئة الكاملة تعمل يوميًا بغض النظر عن ذلك، يجب أن تأخذ ذلك في الاعتبار وتتضمن التعامل مع المعلمة :backfill.

بالنسبة للمستخدمين الذين حصلوا بالفعل على أكثر من فضية واحدة، كيف يمكنني الحصول على تلك التي تم منحها؟ هل يجب أن أفعل ذلك يدويًا؟

الدفعة الخلفية هي المهمة اليومية. المشغل ‘تحديث يومي’ هو في الأساس ذلك، في حين أن المشغلات الأخرى هي ‘في الوقت المناسب’ (على سبيل المثال، إذا كانت الشارة تستخدم ‘عندما ينشئ مستخدم أو يحرر منشورًا’ فلن تحتاج إلى الانتظار طوال الليل للحصول عليها).\n\nهل يمكنك إرفاق لقطة شاشة لشارتك حتى أتمكن من رؤية ما قد يكون مختلفًا؟\n\n

تفضل:

بالمناسبة، لقد تحققت من بعض هذه الأشياء لأنني… لا أعرف ما الذي أفعله :joy:

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

وهل لدى المستخدم الخاص بك الذي يحمل “الشارة أ” رقم 13 الأسباب مملوءة عند النظر إلى صفحة /admin/users/{user_id}/{username}/badges الخاصة به؟

لديك الأجزاء المهمة نفسها. :slight_smile: الأجزاء الأخرى لا تزال مشروعة، ولكنها اختيارية.

هل تقوم بتشغيل هذا على موقعك التجريبي أو على موقع اختبار مستضاف ذاتيًا؟

رائع! تم حل اللغز!

لقد افترضت أن المهمة تعمل في الساعات الأولى من صباح (صباحي).

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

هذا على موقع الاختبار الخاص بي، بالمناسبة.

أفترض أن الشارة الثانية سيتم منحها في غضون ساعات قليلة، لكنني أود أن أرى شارات متعددة تُمنح في وقت واحد. هل سيحدث ذلك إذا قمت بإلغاء الفضية؟ هل سيتم منحه شارتين فضيتين جديدتين في… ساعتين؟

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