在 rails console 中重命名标签

继续讨论 无法修复带有点/句点的标签名称

您好,

有人能提供一份经过测试的指南,说明如何在 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 个赞

哦,是的,我甚至都没注意到 bash 错误。我应该多睡会儿……谢谢!!

3 个赞

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