Невозможно удалить значок, если пользователь выбрал его в качестве значка профиля

Полагаю, это ещё одна проблема с повреждённой таблицей? Хотя это происходит на инстансе, где маловероятно некорректное завершение работы базы данных.

Я создал и удалил бейдж без участников, и всё прошло успешно. Я добавил пользователя в новый бейдж и удалил его, и это также сработало.

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 = (другой id) WHERE granted_title_badge_id = 118

4 лайка

Ого. Это действительно похоже на проблему. Вот почему я говорю людям не вносить изменения в БД через SQL.

По крайней мере, затронуты только два пользователя. Возможно, я ещё смогу прокрутить и узнать, кто они.

Но всё равно кажется багом, что нельзя удалить значок, если кто-то его носит.

Переклассифицирую как баг.

3 лайка

Нет. Похоже на (незначительный) баг, что вы можете инициировать удаление бейджа, если он у кого-то есть. Было бы лучше, если бы интерфейс пользователя предотвращал это. Совершенно верно, что база данных блокирует удаление и сохраняет ссылочную целостность.

2 лайка

Согласен, что лучше не удалять значок, чем оставлять систему в нерабочем состоянии, но сейчас она возвращает ошибку 500 без объяснения.

Конечно, это небольшая ошибка в пользовательском опыте, но она мешает тому, кто не знает столько же, сколько вы, удалить значок. :slight_smile:

Огромное спасибо за вашу помощь. Я жду, что произойдёт с теми пользователями, чьи профили я удалил!

3 лайка

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