使用 rails 等批量创建用户

我想添加大量用户名(以创建初始的虚拟用户来发帖)。
所以我尝试创建一个 rake 文件,然后加载并运行它。但没有成功。有时 rake 文件甚至没有被加载,当我使用另一种方法时,它会被加载然后抛出错误“我不知道如何创建……”,这是由 rails c 抛出的错误(由于我尝试了无数种方法数小时但都没有成功,我甚至记不清错误消息了)。

我做了什么
创建了 users.rake 文件

cd /var/www/discourse
mkdir -p lib/tasks
touch lib/tasks/users.rake

使用 nano 编辑它

cd /var/www/discourse/lib/tasks
sudo nano users.rake

然后将以下代码粘贴到编辑器中并保存

namespace :users do
  desc "Create users from a list"
  task :create, [:usernames, :password, :domain] => :environment do |task, args|
    usernames = args[:usernames].split(',')
    password = args[:password]
    domain = args[:domain]

    User.transaction do
      usernames.each do |username|
        next if User.exists?(username: username)

        email = "#{username}@#{domain}"
        user = User.new(username: username, email: email, password: password)

        unless user.save
          puts "Failed to save user #{username}: #{user.errors.full_messages.join(", ")}"
          raise ActiveRecord::Rollback
        end
      end
    end
  end
end

加载到 rails c 并加载到任务中

rails console
load 'lib/tasks/users.rake'
exit

然后尝试创建用户

./launcher enter app
rake users:create["username1,username2", "password", "domain.com"]

有没有其他方法可以通过终端尝试,而无需使用第三方工具?

使用 rake dev:populate 命令使用开箱即用的测试数据进行填充 - 非常简单!

3 个赞

感谢您的评论。

您的方法只会用一些随机用户和数据填充网站,而我不想这样做。我也不想要一个暂存的在线网站,如果我想的话,我可以自己本地托管。

这是用于生产环境的。虚拟用户将具有一些有意义的主题。这样做的目的是不向公众展示一个空网站。

所以,请告知我一个与我提到的问题相关的解决方案。
我只需要将用户(我有用户姓名列表)插入到 Discourse 的主数据库中。

谢谢。

您也可以将此技术用于本地开发安装(这是其主要用途)。

为什么不阅读该 rake 任务的代码并根据需要进行修改?

1 个赞

我建议您查看 script/import_scripts 中的导入脚本,并找到一个读取 CSV 文件的脚本。

我一直在计划一个脚本或插件,让您可以从电子表格创建内容,但由于其他工作而耽搁了。

1 个赞

我修改了代码,但在 Docker 容器中的生产环境的 discourse 中,我创建了一个 rake 文件,使用 touch 命令创建并用 nano 编辑,然后使用 ./launcher enter app 进入应用程序,接着进入 rails 并检查 rake -T,但 rake 文件没有被加载。这是我的主要担忧。我甚至无法在生产环境中测试该文件。

然而,在本地主机上,没有问题,我只需将文件复制并粘贴到 lib/tasks 中即可正常工作。这个 Docker 和 Docker 容器在需要直接访问东西时很麻烦。而且我甚至找不到它为什么没有自动加载到 rake 任务列表中。

因此,我仍然卡在生产环境中,因为 rake 文件没有自动加载,所以我无法运行命令。

如果我不使用 Docker,您的网站将不支持我,否则我很乐意移除 Docker 并直接托管该网站。这样会让生活轻松很多。

通常,rake 任务在开发环境中进行测试,并可以作为插件的一部分进行部署。

1 个赞

如果您在本地运行成功,则可以先备份本地数据,然后恢复到生产环境。

您是否将文件放在了容器内的 /var/www/discourse/lib/rake 目录下?

问题是,当本地备份上传到实时站点时,它将替换我在实时站点上所做的所有内容。我有一个本地实例,但论坛上的某个人建议我在实时站点上进行开发。所以,我现在正在实时站点上开发(尽管它还没有正式公开)。

我把文件放在了lib/tasks中,本地实例可以工作,但实时实例不行。我也会尝试lib/rake

1 个赞

你不应该在实时站点上进行开发。

你需要在本地进行开发,将更改打包成一个主题组件或插件,然后部署到实时站点。

下面是一个插件中 rake 任务的示例:

2 个赞

我认为你不应该在标准安装上开发 Rails 或 Ember,但我经常在生产容器中进行导入。由于这只是一个 rake 任务,你甚至不需要重新启动服务器即可使更改生效。

由于它不是公开的,如果出现问题,可以安全地恢复到备份。这可能是我会做的地方。

你可以备份实时站点并将其恢复到开发站点,进行工作,然后备份/恢复回实时站点。

3 个赞