Tag / TagGroup CSV-Import ist Groß-/Kleinschreibung-sensitiv, aber das ist er nicht

Reproduktion:

  • Ein Tag namens ABC haben
  • Eine CSV-Datei mit dem Tag abc erstellen
  • Zu /tags gehen und die CSV-Datei hochladen
  • Sehen, dass es mit „Sorry, there was an error uploading foo.csv. Please try again.“ fehlschlägt.

Dies geschieht, weil Tags Groß- und Kleinschreibung beachten, aber eindeutig sein müssen, wobei die Groß- und Kleinschreibung ignoriert wird.

Wenn Sie eine Datei mit 1000 Tags haben, ist es eine ziemliche Aufgabe herauszufinden, wo es schiefgeht.

Der Code macht dies

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

was ein schlechtes Muster ist, da find_by_name Groß- und Kleinschreibung beachtet und create! dies nicht tut [1], sodass es mit ActiveRecord::RecordInvalid : Validation failed: Name has already been taken fehlschlägt.

Dies sollte so etwas sein wie
tag = Tag.where('name ILIKE ?', tag_name).first || Tag.create!(name: tag_name)


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

3 „Gefällt mir“

Danke für die Meldung, fügen Sie dem einen pr-welcome hinzu, ich schätze, wir müssen dieses find_by_name ändern, um eine Groß-/Kleinschreibung ignorierende Suche durchzuführen.

Da wir haben:

Die Korrektur wäre:

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

TagGroup fehlt der Index, also müssten wir ihn hinzufügen und dann dasselbe dort tun.

Hallo @RGJ

Ich konnte Ihr Problem mit einem normalen Tag nicht reproduzieren, aber ich habe den von Ihnen erwähnten Fehler mit einer Tag-Gruppe erhalten.

Dies ist meine Beispiel-CSV:

ABC,TAGGROUP

ABC funktioniert einwandfrei, aber mit der Tag-Gruppe gab es einen Fehler. Wenn Sie eine Beispiel-CSV teilen könnten, helfe ich Ihnen gerne weiter!

Ich habe einen PR erstellt, der das Tag-Gruppen-Problem behebt. Ist SiteSetting.force_lowercase_tags auf Ihrem Forum aktiviert?

1 „Gefällt mir“

Nein, es ist nicht angekreuzt. Entschuldigung, ich sehe jetzt, dass das wichtig ist.

Ich bin mir nicht sicher, wie Sie versuchen, dies zu reproduzieren, aber die CSV sollte ein Kleinbuchstaben-abc enthalten und force_lowercase_tags sollte nicht angekreuzt sein.

1 „Gefällt mir“

Kein Problem, es war eine Website-Einstellung, die ich beim Durchsuchen des Codes gefunden habe, sie könnte wichtig sein!

Ihre CSV ist nur das abc ohne Tag-Gruppen?

Unser Testbeispiel ist (und ich habe es lokal getestet, wobei capitaltag2 komplett großgeschrieben war, aber es funktionierte wie erwartet):

Ich kann es tatsächlich nicht mit einem einzelnen Tag reproduzieren.

Ich habe in meiner ursprünglichen Nachricht einen kleinen Fehler gemacht:

Tag.find_by_name ist nicht case-sensitiv (gut) und Tag.find_by(name: ) ist case-sensitiv (schlecht).
Das liegt daran, dass David dies bereits vor 7 Jahren für Tags behoben hat, indem er die Methode find_by_name überschrieben hat.

Für TagGroup wurde diese Korrektur nie angewendet.

2 „Gefällt mir“