Renomeando tags no console do rails

Continuando a discussão de Não consigo corrigir nomes de tags com pontos/períodos:

Olá,

Alguém pode fornecer um guia testado sobre como renomear tags no console do rails? Não tenho experiência em usar o console do rails e não quero bagunçar o banco de dados…

2 curtidas

Faça SSH no seu servidor

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

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

Existe também uma maneira de alterar uma tag específica em todos os tópicos? Renomeei meu domínio uma vez, houve um método para reescrever todas as referências do domínio antigo para o novo. Isso também pode ser feito com tags? Quero renomear uma tag, mas não confundir os usuários com tags inexistentes.

Editar, resolvi com sinônimos de tag :tada: Embora esteja longe do ideal, pois continuará o uso de tags antigas e será exibido em minha visão geral de tags e autocompletar. Eu realmente gostaria de substituí-la totalmente e tornar a antiga obsoleta.

2 curtidas

Pergunta honesta: como renomear a tag não é suficiente para isso?

1 curtida

Bem, por exemplo, quando uso a tag chat aqui e muitas outras em tópicos diferentes, e então você a renomeia para #chats. Então a tag #chat apontará para uma tag inexistente porque ela não foi renomeada. Portanto, a renomeação funciona bem para títulos de tópicos, mas não para comentários dentro do tópico quando as pessoas já os usaram. Ou estou perdendo alguma coisa?

Agradecimentos extras a @RGJ , funcionou perfeitamente :pray: :pray: :pray:

1 curtida

Acho que não há como renomear tags existentes usadas em tópicos pelos usuários? Então, não as tags nos títulos dos tópicos, mas realmente nos comentários.

Use por sua conta e risco!

Faça isso depois de ter renomeado #foo para #bar

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

Parece legal! Obrigado pelo aviso. Backups mitigarão o risco :nerd_face:.

Para meu entendimento, \"raw like '%#foo%'\", isso é uma correspondência exata? No sentido de, e se você tiver a tag #access que precisa ser renomeada para #access_granted, \"raw like '%#access%'\" corresponderia tanto a #access quanto a #access_granted? Porque nesse caso, comentários existentes que já usam #access_granted poderiam talvez ser renomeados para #accessaccess_granted.

Para comparar com o comando grep, a opção --word-regexp ajuda e garante que você corresponda apenas a palavras inteiras.

Da página do manual:

Seleciona apenas as linhas que contêm correspondências que formam palavras inteiras. O teste é que a subcadeia correspondente deve estar no início da linha ou precedida por um caractere não constituinte de palavra. Da mesma forma, deve estar no final da linha ou seguida por um caractere não constituinte de palavra. Caracteres constituintes de palavra são letras, dígitos e o underscore.

Este comando funciona de forma semelhante? Claro, posso descobrir fazendo o backup e executando o comando. Mas apenas para entender os riscos, se você souber disso, é claro. Caso contrário, YOLO.

O \"raw like '%#foo%'\" de fato não é uma correspondência exata, mas não precisa ser. Como uma consulta LIKE % é muito custosa em termos de desempenho, optei por não piorá-la ainda mais exigindo um caractere não alfanumérico após ela. A consulta where serve apenas para pré-selecionar - você poderia, na verdade, fazer Post.all.each e funcionaria também (embora muito mais lentamente).

A substituição real está sendo feita pelo gsub e o \\b garante que haja um limite de palavra após a tag, ou seja, a tag termina ali.

Portanto, qualquer postagem contendo #access_granted corresponderia, e o código interno seria executado, mas o gsub não faria nada nesse 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 curtida

Eu quero executar isso agora:

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

Mas recebo um erro bash: syntax error near unexpected token "raw like ‘%#access%’"'ebash: syntax error near unexpected token \"raw like '%#feedback%'\"', antes que eu comece a adivinhar, o # precisa ser escapado?

:point_up: deveria vir depois disso, o código deve ser executado dentro de rails c

2 curtidas

Ah sim, eu nem notei o erro do bash. Preciso dormir mais… Obrigado!!

3 curtidas

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