railsコンソールでタグの名前を変更する

Can’t fix tag names with dots/periods からの議論の続きです。

こんにちは。

railsコンソールでタグの名前を変更する方法について、テスト済みのガイドを提供していただけますか? railsコンソールを使用した経験がなく、データベースを台無しにしたくありません…

「いいね!」 2

SSHでサーバーに接続します

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

t = Tag.find_by_name('oldname')
t.name = 'newname'
t.save
「いいね!」 9

特定のタグをすべてのトピックで変更する方法はありますか?ドメイン名を一度変更した際、古いドメインへの参照をすべて新しいものに書き換える方法がありました。タグでも同様のことができますか?タグ名を変更したいのですが、ユーザーを存在しないタグで混乱させたくありません。

編集、タグの同義語で解決しました :tada: 理想とはほど遠いですが、古いタグの使用が継続され、タグの概要と自動補完に表示されます。完全に置き換えて、古いものを廃止したいです。

「いいね!」 2

率直な質問ですが、タグの名前を変更するだけでは不十分なのはなぜですか?

「いいね!」 1

例えば、ここで #chat のようなタグを使い、他のトピックでも同様にタグを使用した場合、それを #chats にリネームすると、リネームされていないため #chat タグは存在しないタグを指すことになります。したがって、リネームはトピックタイトルではうまく機能しますが、トピックのコメント内で既に使われている場合には機能しません。それとも、何か見落としていることがありますか?

RGJさん、ありがとうございます。とてもスムーズにいきました :pray: :pray: :pray:

「いいね!」 1

トピック内でユーザーが使用している既存のタグの名前を変更する方法はないということでしょうか?トピックのタイトルのタグではなく、コメント内のタグのことです。

自己責任でご利用ください!

#foo#bar に名前変更した でこれを実行してください

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

クールですね!お知らせありがとうございます。バックアップでリスクを軽減できます :nerd_face:

私の理解のために、\"raw like '%#foo%'\" は厳密な一致ですか?つまり、#access というタグを #access_granted に名前変更したい場合、\"raw like '%#access%'\"#access#access_granted の両方に一致しますか?その場合、すでに #access_granted を使用している既存のコメントは、#accessaccess_granted に名前変更される可能性があります。

grep コマンドと比較すると、--word-regexp スイッチが役立ち、全体の一致のみを確実にします。

マニュアルページから:

単語全体の一致を含む行のみを選択します。テストは、一致するサブ文字列が行の先頭にあるか、単語構成文字以外の文字で区切られていることです。同様に、行の末尾にあるか、単語構成文字以外の文字で区切られている必要があります。単語構成文字は、文字、数字、およびアンダースコアです。

このコマンドは同様に機能しますか?もちろん、バックアップを作成してコマンドを実行すればわかります。しかし、リスクを理解するために、もしご存知であれば。そうでなければ、YOLOです。

"raw like '%#foo%'" は確かに厳密な一致ではありませんが、そうである必要はありません。LIKE % クエリはパフォーマンスの観点から非常にコストが高いため、単語境界文字を必要とすることでさらに悪化させないようにしました。where クエリは事前選択のためだけに存在します。実際には Post.all.each を使用しても機能します(ただし、はるかに遅くなります)。

実際の置換は gsub によって行われ、\b はタグの後に単語境界があることを保証します。つまり、タグはそこで終了します。

したがって、#access_granted を含むすべての投稿が一致し、内部コードが実行されますが、その場合 gsub は何も行いません。

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

これを今すぐ実行したいのですが:

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

しかし、bash: syntax error near unexpected token "raw like ‘%#access%’"'およびbash: syntax error near unexpected token \"raw like '%#feedback%'\"' というエラーが発生します。推測を始める前に、# をエスケープする必要はありますか?

:point_up: これは、コードが rails c 内で実行される に来るはずでした。

「いいね!」 2

ああ、バッシュのエラーにも気づきませんでした。もっと寝ないと…ありがとう!!

「いいね!」 3

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