Impossibile eliminare il badge se un utente lo ha impostato come badge del titolo

Immagino che si tratti di un altro problema di tabella corrotta? Tuttavia, questo si verifica su un’istanza in cui è improbabile che il database sia stato spento in modo non corretto.

Ho creato ed eliminato un badge senza membri e ha funzionato correttamente. Ho aggiunto un utente a un nuovo badge e l’ho eliminato, e anche questo ha funzionato correttamente.

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

Ma non sono sicuro di dove guardare o quale indice provare a ricostruire.

1 Mi Piace

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

Cosa ti dice SELECT * FROM user_profiles where granted_title_badge_id = 118;?

4 Mi Piace

Questo mi dà due utenti.
Poi eseguo

delete  FROM user_profiles where granted_title_badge_id = 118;

e poi posso eliminare il badge.

Il mio problema sembra essere risolto, almeno per questo badge.

Ma non dovrebbe essere l’eliminazione del badge a fare questo? Ora sembra più un :bug:

2 Mi Piace

:scream: hai appena eliminato i profili di due utenti :scream:

La prossima volta

UPDATE user_profiles SET granted_title_badge_id = (un altro id) WHERE granted_title_badge_id = 118

4 Mi Piace

Oh. Mio Dio. Sembra davvero un problema. Per questo dico alle persone di non apportare modifiche al database tramite SQL.

Almeno erano solo 2 utenti. Forse riesco ancora a scorrere per vedere chi erano.

Ma sembra comunque un bug il fatto che non si possa eliminare un badge se qualcuno lo possiede.

Ricategorizzo come bug.

3 Mi Piace

No. Sembra un bug (minore) che si possa avviare l’eliminazione di un distintivo se qualcuno lo possiede. Sarebbe meglio se l’interfaccia utente lo impedisse. È assolutamente corretto che il database impedisca l’eliminazione e mantenga l’integrità referenziale.

2 Mi Piace

Sono d’accordo che sia meglio non eliminare il badge piuttosto che lasciare il sistema in uno stato rotto, ma al momento restituisce un errore 500 senza alcuna spiegazione.

È vero, si tratta di un piccolo bug UX, ma impedisce a qualcuno che non sa tanto quanto te di poter eliminare un badge. :slight_smile:

Grazie mille per il tuo aiuto. Sto aspettando di vedere cosa succederà a quegli utenti i cui profili ho eliminato!

3 Mi Piace

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