No se puede eliminar la insignia si un usuario la tiene como su insignia de título

Supongo que este es otro problema de tabla corrupta, aunque ocurre en una instancia donde es poco probable que la base de datos se haya apagado incorrectamente.

Creé y eliminé una insignia sin miembros y funcionó bien. Agregué un usuario a una nueva insignia y la eliminé, y también funcionó bien.

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".

Sin embargo, no estoy seguro de dónde buscar ni qué índice intentar reconstruir.

1 me gusta

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

¿Qué te indica SELECT * FROM user_profiles where granted_title_badge_id = 118;?

4 Me gusta

Eso me da dos usuarios.
Luego ejecuto

delete  FROM user_profiles where granted_title_badge_id = 118;

y después puedo eliminar la insignia.

Parece que mi problema se ha resuelto, al menos para esta insignia.

Pero, ¿no debería eliminar la insignia esto? Ahora parece más bien un :bug:

2 Me gusta

:scream: ¡Acabas de borrar los perfiles de dos usuarios! :scream:

La próxima vez

UPDATE user_profiles SET granted_title_badge_id = (otro id) WHERE granted_title_badge_id = 118

4 Me gusta

Oh. Dios mío. Eso sí que parece un problema. Por eso les digo a la gente que no hagan cambios en la base de datos directamente con SQL.

Al menos solo afectó a 2 usuarios. Quizás aún pueda hacer scroll para ver quiénes eran.

Pero sigue pareciendo un error que no se pueda eliminar una insignia si alguien la tiene.

Reclasificándolo como un error.

3 Me gusta

No. Parece un error (menor) que puedas iniciar la eliminación de una insignia si alguien la tiene. Sería mejor que la interfaz de usuario lo impidiera. Es totalmente correcto que la base de datos impida la eliminación y preserve la integridad referencial.

2 Me gusta

Estoy de acuerdo en que es mejor no eliminar la insignia que dejar el sistema en un estado roto, pero en este momento devuelve un error 500 sin ninguna explicación.

Es cierto que es un error menor de UX, pero impide que alguien que no sabe tanto como tú pueda eliminar una insignia. :slight_smile:

Muchas gracias por tu ayuda. Estoy esperando a ver qué pasa con esos usuarios cuyos perfiles eliminé.

3 Me gusta

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