La importación CSV de etiquetas / TagGroup distingue entre mayúsculas y minúsculas, pero no lo es

Reproducción:

  • Tener una etiqueta llamada ABC
  • Crear un CSV con la etiqueta abc
  • Ir a /tags y subir el CSV
  • Ver que falla con “Lo sentimos, hubo un error al subir foo.csv. Por favor, inténtalo de nuevo”.

Esto ocurre porque las etiquetas distinguen entre mayúsculas y minúsculas, pero deben ser únicas ignorando las mayúsculas y minúsculas.

Si tienes un archivo con 1000 etiquetas, es bastante difícil averiguar dónde falla.

El código hace esto

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)

lo cual es un mal patrón, ya que find_by_name distingue entre mayúsculas y minúsculas y create! no lo hace [1], por lo que falla con ActiveRecord::RecordInvalid : Validation failed: Name has already been taken

Esto debería ser algo como

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


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

3 Me gusta

Gracias por informar, ponle un pr-welcome a esto, supongo que necesitamos cambiar ese find_by_name para que realice una búsqueda insensible a mayúsculas y minúsculas.

Dado que tenemos:

La solución sería:

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

A TagGroup le falta el índice, por lo que necesitaríamos agregarlo y luego hacer lo mismo allí.

Hola @RGJ

No pude reproducir tu problema con una etiqueta normal pero obtuve el error que mencionaste con un grupo de etiquetas.

Este es mi CSV de ejemplo:

ABC,TAGGROUP

ABC funciona bien, pero con el grupo de etiquetas, daría error. Si pudieras compartir un CSV de ejemplo, ¡estaré encantado de ayudarte!

He realizado un PR solucionando el problema del grupo de etiquetas. Además, ¿está habilitado SiteSetting.force_lowercase_tags en tu foro?

1 me gusta

No, está desmarcado. Lo siento, ahora veo que eso importa.

No estoy seguro de cómo estás intentando reproducirlo, pero el CSV debería tener una abc en minúsculas y force_lowercase_tags debería estar desmarcado.

1 me gusta

No te preocupes, era una configuración del sitio que encontré mientras revisaba el código, ¡podría ser importante!

¿Tu CSV es solo abc sin grupos de etiquetas?

Nuestro ejemplo de prueba es (y lo he probado localmente, teniendo capitaltag2 en mayúsculas, pero funcionó como se esperaba):

De hecho, no puedo reproducir el problema solo con una etiqueta.

Cometí un pequeño error en mi OP:

Tag.find_by_name no distingue entre mayúsculas y minúsculas (bueno) y Tag.find_by(name: ) distingue entre mayúsculas y minúsculas (malo).
Esto se debe a que David ya lo arregló para las etiquetas hace 7 años al anular el método find_by_name.

Para TagGroup, esa corrección nunca se aplicó.

2 Me gusta