لا يمكن حذف الشارة إذا كان المستخدم قد اعتمدها كشارة لعنوانه

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

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

Started DELETE "/admin/badges/118" for 71.89.242.121 at 2020-05-28 16:50:04 +0000
Processing by Admin::BadgesController#destroy as */*
  Parameters: {"id"=>"118"}
  Rendering text template
  Rendered text template (Duration: 0.0ms | Allocations: 1)
Completed 500 Internal Server Error in 304ms (ActiveRecord: 0.0ms | Allocations: 114838)
ActiveRecord::InvalidForeignKey (PG::ForeignKeyViolation: ERROR:  update or delete on table "badges" violates foreign key constraint "fk_rails_38ea484ed4" on table "user_profiles"
DETAIL:  Key (id)=(118) is still referenced from table "user_profiles".
)
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-2.0.1/lib/patches/db/pg.rb:72:in `exec_params'
Failed to handle exception in exception app middleware : PG::ForeignKeyViolation: ERROR:  update or delete on table "badges" violates foreign key constraint "fk_rails_38ea484ed4" on table "user_profiles"
DETAIL:  Key (id)=(118) is still referenced from table "user_profiles".

لكنني لا أعرف تمامًا أين أبحث أو أي فهرس يجب أن أحاول إعادة بنائه.

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

TABLE "user_profiles" CONSTRAINT "fk_rails_38ea484ed4" FOREIGN KEY (granted_title_badge_id) REFERENCES badges(id)

ماذا يخبرك الأمر SELECT * FROM user_profiles where granted_title_badge_id = 118;؟

4 إعجابات

هذا يعطيني مستخدمين اثنين.
ثم قمت بـ

DELETE FROM user_profiles WHERE granted_title_badge_id = 118;

وبعد ذلك تمكنت من حذف الشارة.

يبدو أن مشكلتي قد حُلّت، على الأقل لهذه الشارة.

ولكن ألا يجب أن يؤدي حذف الشارة إلى ذلك؟ الآن يبدو الأمر أكثر وكأنه :bug:

إعجابَين (2)

:صرخة: لقد قمت للتو بحذف ملفات مستخدمين اثنين :صرخة:

في المرة القادمة

UPDATE user_profiles SET granted_title_badge_id = (معرف آخر) WHERE granted_title_badge_id = 118

4 إعجابات

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

على الأقل لم يتأثر سوى مستخدمين اثنين. ربما ما زلت أستطيع التمرير لمعرفة من كانوا.

لكن لا يزال يبدو وكأنه خطأ أنه لا يمكن حذف شارة إذا كان شخص ما يمتلكها.

إعادة التصنيف كخطأ.

3 إعجابات

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

إعجابَين (2)

أتفق على أنه من الأفضل عدم حذف الشارة بدلاً من ترك النظام في حالة معطلة، لكن حاليًا يعيد خطأ 500 دون أي شرح.

حقيقةً إنها مشكلة UX بسيطة، لكنها تمنع شخصًا لا يملك نفس معرفتك من حذف الشارة. :slight_smile:

شكرًا جزيلاً لمساعدتك. أنا بانتظار رؤية ما سيحدث لتلك المستخدمين الذين حذفتُ ملفاتهم الشخصية!

3 إعجابات

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.