אב

בעיה ופתרון במוודל: תקלה בעריכת שאלות אחרי ייבוא קורס

לאחר שייבאתי קורסים מפלטפורמת Moodle בגרסה 3.9 לפלטפורמה בגרסה 4.4, נתקלתי בבעיה בחלק מהשאלות בבחנים. כאשר ניסיתי לערוך את השאלות, קיבלתי את הודעת השגיאה הבאה:

Coding error detected, it must be fixed by a programmer: Invalid context id specified context::instance_by_id()

עדכון: פתרון יותר קצר ואלגנטי נמצא בפוסט הזה.

כאשר נכנסתי לבוחן, כל מה שהיה לי הוא cmid=565 בכתובת ה-URL, ולכן הייתי צריכה שאילתה שתביא לי את כל המידע הנחוץ על סמך נתון זה בלבד.

לאחר בדיקה מעמיקה בקוד, גיליתי שהשגיאה נובעת מכך שהשאלה לא מוגדרת כראוי תחת קטגוריה במאגר השאלות. ניסיתי להעביר את השאלה ידנית לקטגוריה כלשהי על מנת שהיא תירשם בבסיס הנתונים, אך העברת השאלה לא גרמה ל-ID של הקטגוריה להיכנס כראוי לבסיס הנתונים.

החלטתי להכניס ידנית את ה-ID של הקטגוריה החסרה ישירות לבסיס הנתונים. לשם כך, היה עלי לאתר את קטגוריית ברירת המחדל של הקורס ולהוסיף אליה את השאלות. זה אולי נראה כמו פתרון פשוט מדי, אבל בפועל, הוא היה בדיוק הפתרון הנכון שאיפשר לערוך את השאלות בהצלחה.

בזכות עזרה של AI, הצלחתי למצוא את הטבלאות הרלוונטיות, ויצרתי שאילתה שהחזירה לי את המידע הנחוץ. לאחר מכן, עם עוד קצת עזרה, יצרתי שאילתה נוספת שגם עדכנה את הרשומות של השאלות הרלוונטיות.

להלן השאילתה:

-- שלב 1: אחזור ה-ID של הקורס ושל ה-instance שקשור אליו
WITH course_info AS (
    SELECT cm.course, cm.instance
    FROM mdl_course_modules cm
    WHERE cm.id = 1729
),

-- שלב 2: אחזור ה-ID של הבוחן שקשור לקורס ול-instance
quiz_info AS (
    SELECT q.id AS quiz_id
    FROM mdl_quiz q
    JOIN course_info ci ON q.id = ci.instance
),

-- שלב 3: אחזור הקטגוריות של השאלות ומידע על ההקשר שלהן
question_categories AS (
    SELECT qc.*
    FROM mdl_question_categories qc
    WHERE qc.id IN (
        SELECT qbe.questioncategoryid
        FROM mdl_quiz_slots qs
        JOIN mdl_question_references qr ON qr.component = 'mod_quiz' AND qr.questionarea = 'slot' AND qr.itemid = qs.id
        JOIN mdl_question_bank_entries qbe ON qbe.id = qr.questionbankentryid
        WHERE qs.quizid IN (SELECT quiz_id FROM quiz_info)
        )
),

-- שלב 4: אחזור ה-IDs של השאלות שקשורות לבוחן
quiz_questions AS (
   SELECT q.id AS questionid
    FROM mdl_quiz qz
    JOIN mdl_quiz_slots qs ON qs.quizid = qz.id
    JOIN mdl_question_references qr ON qr.component = 'mod_quiz'
                                      AND qr.questionarea = 'slot'
                                      AND qr.itemid = qs.id
    JOIN mdl_question_versions qv ON qv.questionbankentryid=qr.questionbankentryid
    JOIN mdl_question q ON q.id = qv.questionid
    WHERE qz.id IN (SELECT quiz_id FROM quiz_info)
    ORDER BY qs.slot
)

-- שלב 5: עדכון השדה category בטבלת mdl_question
UPDATE mdl_question q
SET q.category = (
    SELECT qc.id
    FROM question_categories qc
)
WHERE q.id IN (SELECT questionid FROM quiz_questions);

כעת, אסביר את השאילתה:

  1. שלב 1: אנו מתחילים באחזור ה-ID של הקורס וה-instance (מזהה הייחודי של מודול הקורס) הקשורים אליו, לפי ה-ID של המודול בקורס (1729 במקרה זה).
  2. שלב 2: אנו מאחסנים את ה-ID של הבוחן שקשור לקורס ול-instance הנוכחי.
  3. שלב 3: בשלב זה, אנו מאחזרים את הקטגוריות של השאלות ומידע על ההקשר שלהן מתוך טבלת השאלות, בהתבסס על ה-quiz_id שהשגנו בשלב 2.
  4. שלב 4: אנו אוספים את ה-IDs של השאלות שקשורות לבוחן, על מנת לדעת אילו שאלות יש לעדכן.
  5. שלב 5: לבסוף, אנו מעדכנים את השדה category בטבלת השאלות (mdl_question) עבור השאלות שזוהו בשלב 4, תוך שימוש ב-ID של הקטגוריה שנמצאה בשלב 3.

בסופו של דבר, פתרון זה הוכיח את עצמו כיעיל ואיפשר לי לתקן את השאלות עבור מנהלי הקורסים, כך שהם יוכלו להמשיך לעבוד ללא תקלות נוספות.

איור המציג תרשים זרימה צבעוני עם עיפרון, סימן צלב לבעיה, סימן ביקורת לפתרון ועכבר מחשב, המייצג שלבי פתרון בעיות.
האיור נוצר לבקשתי באמצעות Idegram

כתבו תגובה

כתובת הדוא"ל שלכם לא תוצג.