Rinominare i tag nella console rails

Continuando la discussione da Impossibile correggere i nomi dei tag con punti/periodi:

Ciao,

Qualcuno può fornire una guida testata su come rinominare i tag nella console di rails? Non ho esperienza nell’uso della console di rails e non voglio incasinare il database…

2 Mi Piace

Accedi al tuo server tramite SSH

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

t = Tag.find_by_name('oldname')
t.name = 'newname'
t.save
9 Mi Piace

C’è anche un modo per cambiare un tag specifico in tutti gli argomenti? Ho rinominato il mio dominio una volta, c’era un metodo per riscrivere tutti i riferimenti al vecchio dominio a quello nuovo. Si può fare anche con i tag? Voglio rinominare un tag, ma non confondere gli utenti con tag inesistenti.

Modifica, ho risolto con i sinonimi di tag :tada: Sebbene sia lungi dall’essere l’ideale, poiché continuerà l’uso dei vecchi tag e verrà mostrato nella mia panoramica dei tag e nell’autocompletamento. Vorrei davvero sostituirlo completamente e rendere obsoleto quello vecchio.

2 Mi Piace

Domanda onesta: come mai rinominare il tag non è sufficiente per questo?

1 Mi Piace

Ad esempio, quando uso il tag chat qui e molti altri in argomenti diversi, e poi lo rinomini in #chats. Allora il tag #chat punterà a un tag non esistente perché non è stato rinominato. Quindi la rinomina funziona bene per i titoli degli argomenti, ma non per i commenti all’interno degli argomenti quando le persone li hanno già usati. O mi sfugge qualcosa?

Grazie mille anche a @RGJ , ha funzionato alla grande :pray: :pray: :pray:

1 Mi Piace

Non c’è modo di rinominare i tag esistenti utilizzati negli argomenti dagli utenti? Quindi non i tag nei titoli degli argomenti, ma davvero nei commenti.

A tuo rischio e pericolo!

Fai questo dopo aver rinominato #foo in #bar

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

Sembra fantastico! Grazie per l’avviso. I backup mitigheranno il rischio :nerd_face:.

Per mia comprensione, \"raw like '%#foo%'\", si tratta di una corrispondenza esatta? Nel senso, cosa succede se hai il tag #access che deve essere rinominato in #access_granted, \"raw like '%#access%'\" corrisponderebbe sia a #access che a #access_granted? Perché in quel caso i commenti esistenti che usano già #access_granted potrebbero forse essere rinominati in #accessaccess_granted.

Per confrontarlo con il comando grep, l’opzione --word-regexp aiuta e assicura che vengano trovate solo parole intere.

Dalla pagina man:

Seleziona solo le righe che contengono corrispondenze che formano parole intere. Il test è che la sottostringa corrispondente deve trovarsi all’inizio della riga, o essere preceduta da un carattere non costituente di parola. Allo stesso modo, deve trovarsi alla fine della riga o essere seguita da un carattere non costituente di parola. I caratteri costituenti di parola sono lettere, cifre e il trattino basso.

Questo comando funziona in modo simile? Ovviamente posso scoprirlo facendo il backup ed eseguendo il comando. Ma solo per capire i rischi, se lo sai ovviamente. Altrimenti, YOLO.

La stringa \"raw like '%#foo%'\" non è in effetti una corrispondenza esatta, ma non è necessario che lo sia. Poiché una query LIKE % è molto costosa in termini di prestazioni, ho scelto di non peggiorarla ulteriormente richiedendo un carattere non di parola dopo di essa. La query where è solo lì per pre-selezionare: potresti effettivamente fare Post.all.each e funzionerebbe comunque (anche se molto più lentamente).

La sostituzione effettiva viene eseguita da gsub e \b garantisce che ci sia un confine di parola dopo il tag, cioè il tag termina lì.

Quindi, qualsiasi post contenente #access_granted corrisponderebbe e il codice interno verrebbe eseguito, ma gsub non farebbe nulla in quel 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 Mi Piace

Voglio eseguirlo ora:

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

Ma ricevo un errore bash: syntax error near unexpected token "raw like ‘%#access%’"'ebash: syntax error near unexpected token \"raw like '%#feedback%'\"', prima di iniziare a indovinare, il # deve essere escapato?

:point_up: doveva venire dopo questo, il codice va eseguito all’interno di rails c

2 Mi Piace

Oh sì, non avevo nemmeno notato l’errore bash. Dovrei dormire di più… Grazie!!

3 Mi Piace

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