Anche in questo caso c’erano due voci in cui ‘shiny-server’ corrispondeva a una sola, mentre ‘%hiney-server’ corrispondeva a entrambe. Non vedo come questo mi aiuti a capire, ma penso tu stia dicendo che la mia istruzione select si aspetta che venga restituito un solo elemento, lo estrae dall’indice ignorando gli altri, mentre quando uso % viene eseguita una ricerca nei campi.
discourse=> EXPLAIN ANALYZE select * from tags where name='shiny-server';
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------
Index Scan using index_tags_on_name on tags (cost=0.28..8.29 rows=1 width=36) (actual time=0.038..0.040 rows=1 loops=1)
Index Cond: ((name)::text = 'shiny-server'::text)
Planning time: 0.129 ms
Execution time: 0.070 ms
(4 righe)
Dubito fortemente che chiunque non sia in grado di capire tutto questo da solo troverà utile questa spiegazione, ma… ho cercato di individuare le due tag_id con lo stesso nome e ho eseguito operazioni del tipo:
TopicTag.where(tag_id: 717).update_all(tag_id: 611)
Tag.ensure_consistency!
Tag.find(717) # assicurati che non sia associato a nessun argomento
Tag.find(717).destroy
e poi ho eseguito reindex table tags; in psql.
Sembra ora che dovrò fare lo stesso per users, più o meno come descritto da @bartv. Tuttavia, con i miei utenti, vedo un utente David e un altro utente david, oltre a [Mm]ark.
Questi li ho risolti così:
marks=User.where("username similar to '[Mm]+ark'").pluck(:id,:username,:created_at)
Poi ho individuato il nuovo Mark in /admin/users e ho rinominato l’utente lì. Infine, ho provato a eseguire reindex table users; in psql (sudo su - discourse e poi psql).