是否有批量更改用户“名称”(注意:非用户名)的方法?

我们的论坛上有几百名用户,他们的姓名(不是用户名,是姓名)由于外部 SSO 提供商(通过 WordPress)在创建账户时的设置问题,被意外设置成了他们的电子邮件地址。

有没有一种相对简单的方法可以批量将这些姓名从 the_name@example.com 更改为 the_name(即截断“@”之后的所有内容),而无需逐个手动进入每个配置文件进行修改?

你可以在 Rails 控制台中操作。这比在这里能解释的要复杂得多,尤其是因为电子邮件地址已不再存储在用户记录中。如果你有预算,可以在 Marketplace 频道发帖或直接联系我。

或者,如果你并不在意实际的电子邮件地址……

类似这样:

users = User.where('username like ?', '%@%')

然后遍历结果,使用 gsub 将 @ 及其后面的所有内容移除。这是我能在手机上提供的最佳方案。

感谢回复 @pfaffman。我可以编写 SQL,但在 Rails 控制台中操作对我来说有点超出我的专长范围。我该如何进入 Discourse 的 Python 控制台呢?:slightly_smiling_face:

如果能有一个类似数据浏览器的工具,允许你编写 UPDATE 查询就好了——虽然我也明白这可能存在潜在风险。

有人知道是否有办法将第三方 SQL 工具(如 Sequel Pro 或同类工具)连接到自托管 Docker 版 Discourse 的运行中数据库吗?

是的,但在 Rails 中操作会让数据库出错的风险大大降低。比如,如果你用 Rails 操作,你会知道没有创建非法的用户名(而且如果修改某个表时需要更新其他相关表,Rails 会自动处理,而 SQL 不会)。

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

现在你已经进入 Rails 环境了。

users=User.where("username like '%@%'")
users.each do |user|
  user.name.gsub!(/@(.*)/,"")
  puts "新名称:#{user.name}"
  # user.save
end

我认为这应该能达到你的目的。如果看起来可行,你可以取消注释 user.save 然后试试看。

先做个备份,好吗?(或者更好的做法是在测试服务器上操作。)

哇,太感谢你的代码了!

我这个 Discourse 实例没有测试服务器,但我可以做个备份,然后在明天凌晨流量很少(或几乎没有)的时候运行代码。这样如果出现问题,我可以立即恢复。

非常感谢 @pfaffman

如果 puts 看起来没问题,那应该挺安全的。祝好!

@ 处截断仍然会让个人信息(电子邮件地址)在很大程度上对“大坏互联网”可见(鉴于大多数人使用的是 @gmail.com 或少数其他大型提供商)。您可能最好将其设置为与用户名相同的值。

感谢 @lionel-rowe,这是一个很好的观点。不过用户名已经是这个相同的值了(用户名是通过从用户电子邮件地址中提取 ‘@’ 之前的所有内容创建的)。

太可怕了。

我不得不对代码进行一点小修改,并添加一个小过程来使其正常工作。这是修改后的代码:

users=User.where("name like '%@%'")

然后 Rails 控制台开始通过“more”命令向你展示用户数据,所以我需要输入 q 退出。接着:

users.each do |user|
  user.name.gsub!(/@(.*)/,"")
  puts "新名称:#{user.name}"
  # user.save
end

随后 Rails 控制台向我展示了新名称的列表(正确!),然后再次进入用户的“more”模式。再次输入 q 退出。

接着:

users.each do |user|
  user.name.gsub!(/@(.*)/,"")
  puts "新名称:#{user.name}"
  user.save
end

……不再有包含电子邮件地址的用户名,论坛前端一切正常。

再次感谢 @pfaffman 的慷慨帮助。