Ciao a tutti,
Da self-hoster, ultimamente ho contratto la “OCD digitale”. Avevo alcune categorie e tag eliminati dai miei primi giorni di test e volevo davvero recuperare quegli ID puliti a una sola cifra (come l’ID Categoria 2 e l’ID Tag 3), invece di lasciare dei buchi nel mio database.
So che l’interfaccia utente non supporta questa operazione, quindi sono entrato nella console Rails (./launcher enter app → rails c) per rimettere insieme le cose manualmente. Al momento, tutto sembra e funziona perfettamente sul frontend, ma sono curioso di sapere se gli esperti di database qui presenti vedono qualche pericolo nascosto o mina a lunga distanza nel fare questo.
Ecco il flusso di lavoro esatto e dettagliato che ho eseguito:
1. Ricreazione della Categoria eliminata utilizzando il suo vecchio ID con tutti gli attributi: Invece di forzare semplicemente un ID, ho fornito gli attributi essenziali in modo che il record fosse completo.
Ruby
Category.create!(
id: 2,
name: "Site Feedback",
color: "0088CC",
text_color: "FFFFFF",
user_id: -1 # Utente di sistema
)
2. Recupero dell’argomento originale e collegamento come descrizione della categoria:
Ruby
Topic.with_deleted.find(1).recover!
Category.find(2).update!(topic_id: 1)
3. Pulizia del sottotipo dell’argomento (ripristino al valore predefinito di base): Ho controllato altre categorie predefinite e ho notato che i loro argomenti di descrizione usano semplicemente nil, quindi l’ho riportato allo stato di fabbrica.
Ruby
Topic.find(1).update!(subtype: nil)
4. Ricreazione in blocco dei vecchi tag per colmare i buchi negli ID:
Ruby
Tag.create!([
{ id: 3, name: "private-school" },
{ id: 7, name: "tennis" }
])
La mia domanda principale: Capisco perfettamente che non c’è un bisogno pratico di farlo, se non per soddisfare la mia stessa OCD. Tuttavia, strettamente da un punto di vista strutturale, i metodi base di ActiveRecord come .update! e .create! attivano in modo sicuro tutte le callback necessarie di Discourse (indicizzazione della ricerca, aggiornamenti della cache Redis, job Sidekiq, routing, ecc.)? O ho accidentalmente aggirato una logica interna cruciale che potrebbe rompere una futura migrazione dello schema?
Grazie per aver soddisfatto la mia curiosità!