PG::UndefinedTable: خطأ: العلاقة "voice_rooms" غير موجودة

حسنًا - على الأرجح أن هجرة (migration) Resenha كان يُفترض أن تكون قد نُفّذت لكنها لم تنفَّذ. وبما أن نفس رقم إصدار الهجرة يُستخدم في النواة (core) لوظيفة الصوت، فإن محاولة إضافة عمود لجدول voice_rooms لن تنجح لأن اسم الجدول لا يزال resenha_rooms.

يمكنك تشغيل هذا الأمر مؤقتًا في psql الخاص بك:

DO
$$
  DECLARE
    has_resenha boolean;
    has_voice   boolean;
    table_pair  record;
  BEGIN
    SELECT EXISTS (SELECT 1
                   FROM unnest(ARRAY [
                     'resenha_rooms',
                     'resenha_room_memberships',
                     'resenha_sessions',
                     'resenha_co_presences',
                     'resenha_recordings',
                     'resenha_invites'
                     ]) AS names(name)
                   WHERE to_regclass(format('public.%I', name)) IS NOT NULL)
    INTO has_resenha;

    SELECT EXISTS (SELECT 1
                   FROM unnest(ARRAY [
                     'voice_rooms',
                     'voice_room_memberships',
                     'voice_sessions',
                     'voice_co_presences',
                     'voice_recordings',
                     'voice_invites'
                     ]) AS names(name)
                   WHERE to_regclass(format('public.%I', name)) IS NOT NULL)
    INTO has_voice;

    IF has_resenha AND has_voice THEN
      RAISE EXCEPTION
        'Both Resenha and Voice tables exist. Nothing was changed.';
    END IF;

    IF NOT has_resenha THEN
      IF to_regclass('public.voice_rooms') IS NOT NULL THEN
        RAISE NOTICE 'The tables have already been renamed.';
        RETURN;
      END IF;

      RAISE EXCEPTION
        'Neither resenha_rooms nor voice_rooms exists. Nothing was changed.';
    END IF;

    IF EXISTS (SELECT 1
               FROM schema_migrations
               WHERE version = '20260831162602') THEN
      RAISE EXCEPTION
        'The rename migration is already recorded. Nothing was changed.';
    END IF;

    FOR table_pair IN
      SELECT *
      FROM (VALUES ('resenha_rooms', 'voice_rooms', '20241107000000'),
                   ('resenha_room_memberships', 'voice_room_memberships',
                    '20241107000000'),
                   ('resenha_sessions', 'voice_sessions', '20260305165400'),
                   ('resenha_co_presences', 'voice_co_presences',
                    '20260305165401'),
                   ('resenha_recordings', 'voice_recordings', '20260717172530'),
                   ('resenha_invites', 'voice_invites',
                    '20260813160047')) AS pairs(old_name, new_name, migration_version)
      LOOP
        IF EXISTS (SELECT 1
                   FROM schema_migrations
                   WHERE version = table_pair.migration_version) AND
           to_regclass(format('public.%I', table_pair.old_name)) IS NULL THEN
          RAISE EXCEPTION
            'Migration % is recorded, but table % is missing. Nothing was changed.',
            table_pair.migration_version,
            table_pair.old_name;
        END IF;

        IF to_regclass(format('public.%I', table_pair.old_name)) IS NOT NULL THEN
          EXECUTE format(
            'ALTER TABLE public.%I RENAME TO %I',
            table_pair.old_name,
            table_pair.new_name
                  );

          RAISE NOTICE 'Renamed % to %', table_pair.old_name, table_pair.new_name;
        END IF;
      END LOOP;
  END
$$;

يقوم هذا الكود بالآتي:

  1. يتحقق من جداول Resenha و Voice الموجودة.
  2. سيرفض المتابعة إذا كانت الجداول من النوعين موجودة (لا أتوقع حدوث ذلك).
  3. يتحقق من أن الهجرات المسجلة هي ما نتوقعه.
  4. يعيد تسمية الجداول الموجودة:
    • resenha_rooms → voice_rooms
    • resenha_room_memberships → voice_room_memberships
    • resenha_sessions → voice_sessions
    • resenha_co_presences → voice_co_presences
    • resenha_recordings → voice_recordings
    • resenha_invites → voice_invites
  5. يساعد هذا في معالجة الحالة الوسيطة الغريبة التي تعاني منها. يجب أن ينجح إعادة البناء بعد ذلك.

يجب أن يسمح هذا لبقية هجرات النواة الخاصة بك بالنجاح (سيكون أحدث هجرة صوت في النواة التي تقوم بإعادة التسمية بدون أي تأثير فعلي).

سأتحقق مع فريقنا لمعرفة ما إذا كان يجب علينا ترحيل هذا كمهمة rake.