במהלך שדרוג מערכת מוודל מגרסה 3.9 ל-4.4, נתקלתי בבעיה מעניינת שהשפיעה על חלק מהשאלות בבחנים. בניסיון לערוך שאלות מסוימות, המערכת הציגה שגיאה מפתיעה:
Coding error detected, it must be fixed by a programmer: Invalid context id specified context::instance_by_id()
חקירה ראשונית העלתה כי השגיאה נבעה מבעיה בהגדרת הקטגוריות של השאלות במאגר. ניסיונות לתקן את הבעיה באמצעות ממשק המשתמש – כמו העברת שאלות בין קטגוריות – לא הניבו תוצאות.
תחילה, ניסיתי לפתור את הבעיה באמצעות גישה לבוחן דרך ה-cmid. זה היה המידע היחיד שהיה זמין לי בכתובת ה-URL של הבוחן (לדוגמה, cmid=565
). על בסיס זה ובעזרת AI, פיתחתי שאילתה מורכבת שניסתה לאחזר את כל המידע הדרוש ולתקן את הבעיה. השאילתה כללה מספר שלבים:
- אחזור מידע על הקורס וה-instance הקשור אליו.
- זיהוי הבוחן הספציפי.
- איתור הקטגוריות של השאלות ומידע על ההקשר שלהן.
- זיהוי השאלות הקשורות לבוחן.
- עדכון שדה הקטגוריה בטבלת השאלות.
למרות שהשאילתה הזו הייתה מקיפה, היא התבררה כמסורבלת ולא יעילה מספיק לפתרון הבעיה בקנה מידה גדול. חוץ מזה, היא גם לא תמיד עבדה.
כשראיתי שיש שאלות שאני לא מצליחה לתקן בעזרתה, קראתי אותה לעומק כדי להבין מנין לוקחת השאילתה את מזהה הקטגוריה, כדי לעדכן את טבלת mdl_question
איתה.
בסופו הצלחתי להבין שמזהה הקטגוריה נשמר בשתי טבלאות מרכזיות:
mdl_question
: הטבלה המרכזית המכילה את פרטי השאלות.mdl_question_bank_entries
: טבלה המקשרת בין שאלות לקטגוריות שלהן.
בתהליך הייבוא, נוצר מצב בו ערך הקטגוריה בטבלת mdl_question
התאפס או השתבש עבור חלק מהשאלות, בעוד שהמידע הנכון נשמר בטבלת mdl_question_bank_entries
.
בעקבות תובנה זו, פיתחתי פתרון פשוט יותר ויעיל בהרבה, המתבסס על שאילתת SQL קצרה:
UPDATE mdl_question q
JOIN mdl_question_bank_entries qbe ON e.id = q.id
SET q.category = qbe.questioncategoryid
WHERE q.category
=0 AND qbe.questioncategoryid IS NOT NULL;
או אם מתברר שהרשומה של השאלה לא קיימת ב-mdl_question_bank_entries
, אפשר למצוא את הרשומה שם עפ”י הטבלה mdl_question_versions
. לשם כך נוסיף עוד שורה לשאילתה
UPDATE mdl_question q
JOIN mdl_question_versions qv ON q.id = qv.questionid
JOIN mdl_question_bank_entries qbe ON qbe.id=qv.questionbankentryid
SET q.category = qbe.questioncategoryid
WHERE q.category=0
AND qbe.questioncategoryid IS NOT NULL;
השאילתה הזו פותרת את הבעיה באופן אלגנטי:
- היא מסנכרנת את ערכי הקטגוריה בין שתי הטבלאות.
- מתקנת את אי-ההתאמה שנוצרה במהלך תהליך הייבוא.
- מבטיחה שכל שאלה משויכת לקטגוריה הנכונה שלה.
לאחר הרצת השאילתה, השאלות הבעייתיות הפכו נגישות לעריכה. המורים יכלו לחזור ולנהל את הבחנים שלהם ללא הפרעה, והמערכת חזרה לתפקוד תקין.
