Importazione CSV Tag / TagGroup è sensibile alle maiuscole, ma non lo è

Riproduzione:

  • Avere un tag chiamato ABC
  • Creare un CSV con il tag abc
  • Andare su /tags e caricare il CSV
  • Vedere che fallisce con “Spiacenti, si è verificato un errore durante il caricamento di foo.csv. Riprova.”

Questo accade perché i tag sono sensibili alle maiuscole ma devono essere univoci ignorando le maiuscole.

Se hai un file con 1000 tag, è un bel lavoro capire dove va storto.

Il codice fa questo

TAG = Tag.find_by_name(tag_name) || Tag.create!(name: tag_name)
...
TagGroup = TagGroup.find_by(name: tag_group_name) || TagGroup.create!(name: tag_group_name)

che è un pattern errato, poiché find_by_name è case sensitive e create! non lo è [1], quindi genera un errore con ActiveRecord::RecordInvalid : Validation failed: Name has already been taken

Questo dovrebbe essere qualcosa come

tag = Tag.where('name ILIKE ?', tag_name).first || Tag.create!(name: tag_name)


  1. perché validates :name, presence: true, uniqueness: { case_sensitive: false } ↩︎

3 Mi Piace

Grazie per la segnalazione, aggiungi un pr-welcome a questo, immagino che dobbiamo cambiare quel find_by_name per fare una ricerca non sensibile alle maiuscole.

Dato che abbiamo:

La correzione sarebbe:

TAG = Tag.where('lower(name) = ?', tag_name.downcase).first

A TagGroup manca l’indice, quindi dovremmo aggiungerlo e poi fare lo stesso lì.

Ciao @RGJ

Non sono riuscito a riprodurre il tuo problema con un tag normale ma ho riscontrato l’errore che hai menzionato con un gruppo di tag.

Questo è il mio CSV di esempio:

ABC,TAGGROUP

ABC funziona bene, ma con il gruppo di tag, si verificherebbe un errore. Se potessi condividere un CSV di esempio, sarò più che felice di aiutarti!

Ho creato una PR che corregge il problema del gruppo di tag. Inoltre, SiteSetting.force_lowercase_tags è abilitato nel tuo forum?

1 Mi Piace

No, è deselezionato. Mi dispiace, ora vedo che questo è importante.

Non sono sicuro di come tu stia cercando di riprodurre il problema, ma il CSV dovrebbe avere abc in minuscolo e force_lowercase_tags dovrebbe essere deselezionato.

1 Mi Piace

Non preoccuparti, era un’impostazione del sito che ho trovato mentre scavavo nel codice, potrebbe essere importante!

Il tuo CSV è solo abc senza gruppi di tag?

Il nostro esempio di test è (e ho testato localmente, avendo capitaltag2 tutto maiuscolo, ma ha funzionato come previsto):

Non riesco a riprodurre il problema con un tag da solo.

Ho commesso un piccolo errore nella mia OP:

Tag.find_by_name non fa distinzione tra maiuscole e minuscole (bene) e Tag.find_by(name: ) fa distinzione tra maiuscole e minuscole (male).
Questo perché David ha già risolto il problema per i tag 7 anni fa sovrascrivendo il metodo find_by_name.

Per TagGroup, quella correzione non è mai stata applicata.

2 Mi Piace