Renombrar etiquetas en la consola de rails

Continuando la discusión de No se pueden corregir nombres de etiquetas con puntos/períodos:

Hola,

¿Alguien puede proporcionar una guía probada sobre cómo renombrar etiquetas en la consola de rails? No tengo experiencia usando la consola de rails y no quiero estropear la base de datos…

2 Me gusta

Accede a tu servidor por SSH

cd /var/discourse
./launcher enter app
rails c

t = Tag.find_by_name('oldname')
t.name = 'newname'
t.save
9 Me gusta

¿Hay también una forma de cambiar una etiqueta específica en todos los temas? Una vez renombré mi dominio, hubo un método para reescribir todas las referencias del dominio antiguo al nuevo. ¿Se puede hacer lo mismo con las etiquetas? Quiero renombrar una etiqueta, pero no confundir a los usuarios con etiquetas inexistentes.

Editar, lo resolví con sinónimos de etiquetas :tada: Aunque está lejos de ser ideal, ya que continuará el uso de etiquetas antiguas y se mostrará en mi resumen de etiquetas y autocompletado. Realmente me gustaría reemplazarla por completo y dejar obsoleta la antigua.

2 Me gusta

Pregunta sincera: ¿cómo no es suficiente con renombrar la etiqueta para esto?

1 me gusta

Bueno, por ejemplo, cuando uso la etiqueta chat aquí y muchas otras en diferentes temas, y luego la renombra a #chats. Entonces la etiqueta #chat apuntará a una etiqueta inexistente porque no se renombra. Así que el cambio de nombre funciona bien para los títulos de los temas, pero no para los comentarios dentro del tema cuando la gente ya los ha utilizado. ¿O me estoy perdiendo algo?

Gracias adicionales a @RGJ , funcionó a la perfección :pray: :pray: :pray:

1 me gusta

Supongo que no hay forma de renombrar las etiquetas existentes utilizadas en los temas por los usuarios? Entonces, no las etiquetas en los títulos de los temas, sino realmente en los comentarios.

¡Úselo bajo su propio riesgo!

Haga esto después de haber renombrado #foo a #bar

Post.where("raw like '%#foo%'").each do |p|
  p.raw = p.raw.gsub(/#foo\b/, '#bar')
  p.save!
end
1 me gusta

¡Se ve genial! Gracias por el aviso. Las copias de seguridad mitigan el riesgo :nerd_face:.

Para mi entendimiento, \"raw like '%#foo%'\", ¿es una coincidencia estricta? En el sentido de que, ¿qué pasa si tienes la etiqueta #access que necesita ser renombrada a #access_granted, coincidiría \"raw like '%#access%'\" tanto con #access como con #access_granted? Porque en ese caso, los comentarios existentes que ya usan #access_granted podrían quizás ser renombrados a #accessaccess_granted.

Para compararlo con el comando grep, el modificador --word-regexp ayuda y se asegura de que solo coincidan palabras completas.

De la página del manual:

Selecciona solo las líneas que contengan coincidencias que formen palabras completas. La prueba es que la subcadena coincidente debe estar al principio de la línea o precedida por un carácter no constitutivo de palabra. De manera similar, debe estar al final de la línea o seguida por un carácter no constitutivo de palabra. Los caracteres constituyentes de palabra son letras, dígitos y el guion bajo.

¿Funciona este comando de manera similar? Por supuesto, puedo averiguarlo haciendo la copia de seguridad y ejecutando el comando. Pero solo para entender los riesgos, si sabes esto, por supuesto. De lo contrario, YOLO.

La cadena \"raw like '%#foo%'\" en realidad no es una coincidencia estricta, pero no es necesario que lo sea. Dado que una consulta LIKE con % es muy costosa en términos de rendimiento, elegí no empeorarla exigiendo un carácter que no sea de palabra después de ella. La consulta where está ahí solo para preseleccionar; de hecho, podrías usar Post.all.each y funcionaría igual (aunque mucho más lento).

El reemplazo real lo realiza gsub y \\b asegura que haya un límite de palabra después de la etiqueta, es decir, la etiqueta termina ahí.

Por lo tanto, cualquier publicación que contenga #access_granted coincidiría, y el código interno se ejecutaría, pero gsub no haría nada en ese caso.

irb(main):010:0> "Tag #access is here".gsub(/#access\b/, "#access_granted")
=> "Tag #access_granted is here"
irb(main):011:0> "Tag #access_granted is here".gsub(/#access\b/, "#access_granted")
=> "Tag #access_granted is here"
1 me gusta

Quiero ejecutar esto ahora:

Post.where("raw like '%#access%'").each do |p|
  p.raw = p.raw.gsub(/#access\b/, '#strategic_access')
  p.save!
end

Post.where("raw like '%#feedback%'").each do |p|
  p.raw = p.raw.gsub(/#feedback\b/, '#digital_feedback')
  p.save!
end

Pero obtengo un error bash: syntax error near unexpected token "raw like ‘%#access%’"'ybash: syntax error near unexpected token \"raw like '%#feedback%'\"', antes de empezar a adivinar, ¿necesita escaparse el #?

:point_up: se suponía que vendría después de esto, el código debe ejecutarse dentro de rails c

2 Me gusta

Oh sí, ni siquiera me di cuenta del error de bash. Necesito dormir más… ¡¡Gracias!!

3 Me gusta

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.