Tags im Rails-Konsolen umbenennen

Fortsetzung der Diskussion von Tag-Namen mit Punkten/Perioden können nicht korrigiert werden:

Hallo,

Kann mir jemand eine getestete Anleitung geben, wie man Tags in der Rails-Konsole umbenennt? Ich habe keine Erfahrung mit der Rails-Konsole und möchte die Datenbank nicht durcheinander bringen…

2 „Gefällt mir“

SSH auf Ihren Server

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

t = Tag.find_by_name('oldname')
t.name = 'newname'
t.save
9 „Gefällt mir“

Gibt es auch eine Möglichkeit, ein bestimmtes Tag in allen Themen zu ändern? Ich habe einmal meine Domain umbenannt, es gab eine Methode, alle Verweise auf die alte Domain auf die neue umzuschreiben. Kann das auch mit Tags gemacht werden? Ich möchte ein Tag umbenennen, aber die Benutzer nicht mit nicht existierenden Tags verwirren.

Bearbeiten, habe es mit Tag-Synonymen gelöst :tada: Obwohl es alles andere als ideal ist, da es die Verwendung alter Tags fortsetzt und in meiner Tag-Übersicht und Autovervollständigung angezeigt wird. Ich möchte es wirklich vollständig ersetzen und das alte obsolet machen.

2 „Gefällt mir“

Ehrliche Frage – warum reicht es nicht aus, das Tag umzubenennen?

1 „Gefällt mir“

Nun, zum Beispiel, wenn ich hier den Tag chat und viele andere in verschiedenen Themen verwende und Sie ihn dann in #chats umbenennen. Dann wird der Tag chat auf einen nicht existierenden Tag verweisen, da er nicht umbenannt wird. Die Umbenennung funktioniert also gut für Themenüberschriften, aber nicht für die Kommentare innerhalb des Themas, wenn die Leute sie bereits verwendet haben. Oder übersehe ich etwas?

Besonderer Dank an @RGJ, es hat wie am Schnürchen geklappt :pray: :pray: :pray:

1 „Gefällt mir“

Ich schätze, es gibt keine Möglichkeit, vorhandene Tags, die von Benutzern in Themen verwendet werden, umzubenennen? Also nicht die Tags in den Themenerstellern, sondern wirklich in den Kommentaren.

Auf eigene Gefahr!

Tun Sie dies, nachdem Sie #foo in #bar umbenannt haben

Post.where("raw like '%#foo%'").each do |p|
  p.raw = p.raw.gsub(/#foo\b/, '#bar')
  p.save!
end
1 „Gefällt mir“

Sieht cool aus! Danke für den Hinweis. Backups werden das Risiko minimieren :nerd_face:.

Zum besseren Verständnis: Ist \"raw like '%#foo%'\" eine strikte Übereinstimmung? In dem Sinne, was ist, wenn Sie den Tag #access haben, der in #access_granted umbenannt werden muss, würde \"raw like '%#access%'\" sowohl #access als auch #access_granted abgleichen? Denn in diesem Fall könnten bestehende Kommentare, die bereits #access_granted verwenden, vielleicht in #accessaccess_granted umbenannt werden.

Um es mit dem grep-Befehl zu vergleichen, hilft der Schalter --word-regexp und stellt sicher, dass nur ganze Wörter abgeglichen werden.

Aus der Manpage:

Wählt nur Zeilen aus, die Übereinstimmungen enthalten, die ganze Wörter bilden. Die Prüfung besteht darin, dass der übereinstimmende Teilstring entweder am Anfang der Zeile stehen oder von einem Nicht-Wort-Zeichen gefolgt werden muss. Ebenso muss er entweder am Ende der Zeile stehen oder von einem Nicht-Wort-Zeichen gefolgt werden. Wortbestandteile sind Buchstaben, Ziffern und der Unterstrich.

Funktioniert dieser Befehl ähnlich? Natürlich kann ich das herausfinden, indem ich das Backup mache und den Befehl ausführe. Aber nur um die Risiken zu verstehen, wenn Sie das natürlich wissen. Ansonsten YOLO.

Die \"raw like '%#foo%'\" ist tatsächlich keine exakte Übereinstimmung, aber das muss sie auch nicht sein. Da eine LIKE %-Abfrage sehr leistungshungrig ist, habe ich mich entschieden, sie nicht noch schlechter zu machen, indem ich ein Nicht-Wortzeichen danach verlange. Die where-Abfrage dient nur zur Vorauswahl – man könnte tatsächlich Post.all.each verwenden und es würde (wenn auch viel langsamer) funktionieren.

Die eigentliche Ersetzung wird durch gsub vorgenommen und \\b stellt sicher, dass nach dem Tag eine Wortgrenze steht, d. h. der Tag endet dort.

Daher würden alle Beiträge, die #access_granted enthalten, übereinstimmen, und der innere Code würde ausgeführt, aber gsub würde in diesem Fall nichts tun.

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 „Gefällt mir“

Ich möchte das jetzt ausführen:

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

Aber ich erhalte einen Fehler bash: syntax error near unexpected token "raw like ‘%#access%’"'undbash: syntax error near unexpected token \"raw like '%#feedback%'\"', bevor ich anfange zu raten, muss das # maskiert werden?

:point_up: es sollte danach kommen, der Code sollte innerhalb von rails c ausgeführt werden

2 „Gefällt mir“

Ja, das habe ich gar nicht bemerkt, den Bash-Fehler. Ich sollte mehr schlafen… Danke!!

3 „Gefällt mir“

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