# Массовое создание пользователей с помощью Rails и других инструментов

**URL:** https://meta.discourse.org/t/bulk-creating-users-with-rails-etc/281716
**Category:** Development
**Created:** [10.Октябрь.2023 06:37:09 UTC](https://meta.discourse.org/t/bulk-creating-users-with-rails-etc/281716 "2023-10-10T06:37:09Z")
**Posts on this page:** 11
**Page:** 1

<div class="post-metadata">

### Author: ![PrettyGirl](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/prettygirl/32/330415_2.png) [@PrettyGirl](https://meta.discourse.org/u/PrettyGirl)
#### Post date: [10.Октябрь.2023 06:37:09 UTC](https://meta.discourse.org/t/bulk-creating-users-with-rails-etc/281716/1 "2023-10-10T06:37:09Z")

</div>

Я хочу добавить множество имен пользователей (чтобы создать начальных тестовых пользователей для публикации постов).

Я пытался создать файл rake, загрузить его и затем запустить, но без успеха. Файл rake иногда даже не загружается, а когда я использую другой метод, он загружается, но возникает ошибка: «I don’t know how to create …» (ошибка, выдаваемая `rails c` — я даже не могу вспомнить точный текст ошибки, так как пробовал тысячи разных методов в течение часов, чтобы заставить это работать, но безуспешно).

Что я сделал:

**Создал файл `users.rake`**

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

```

**Редактировал его с помощью nano**

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

```

**Затем вставил следующий код в редактор и сохранил**

```plaintext
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 и загрузил в задачи**

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

```

**Затем попытался создать пользователей**

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

```

Есть ли какой-то другой метод, который я мог бы попробовать через терминал, не используя сторонние инструменты?

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [10.Октябрь.2023 06:54:48 UTC](https://meta.discourse.org/t/bulk-creating-users-with-rails-etc/281716/2 "2023-10-10T06:54:48Z")

</div>

Используйте `rake dev:populate` для заполнения тестовыми данными «из коробки» — это просто!

> [@Set up a staging server](https://meta.discourse.org/t/set-up-a-staging-server/225951#seeding-a-test-server-12):
>
> There are several tricks that can help when you are setting up a staging server. What is a staging server? A staging server is essentially a clone of a production site. It also resides on a server, and functions identically. It runs inside a Docker container, just as a normal Discourse site does. It exists to give you a place to try risky things out, or to trial things that you cannot easily hide from your users. It is very useful for trialling adverts using the [Discourse Advertising Plugin (A…](https://meta.discourse.org/t/official-advertising-ad-plugin-for-discourse/33734)

---

<div class="post-metadata">

### Author: ![PrettyGirl](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/prettygirl/32/330415_2.png) [@PrettyGirl](https://meta.discourse.org/u/PrettyGirl)
#### Post date: [10.Октябрь.2023 08:26:44 UTC](https://meta.discourse.org/t/bulk-creating-users-with-rails-etc/281716/3 "2023-10-10T08:26:44Z")

</div>

Спасибо за ваш комментарий.

Ваш метод просто заполнит сайт случайными пользователями и данными, чего я не хочу. Мне также не нужна демонстрационная онлайн-версия сайта — если захочу, я могу разместить его локально.

Речь идет о производственной среде. Фейковые пользователи будут иметь действительно значимые темы. Цель не в том, чтобы представить публике пустой сайт.

Поэтому, пожалуйста, сообщите мне решение, связанное с заданным мной вопросом.

Мне нужно просто вставить пользователей (у меня есть список имен) в основную базу данных Discourse.

Спасибо.

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [10.Октябрь.2023 08:41:27 UTC](https://meta.discourse.org/t/bulk-creating-users-with-rails-etc/281716/4 "2023-10-10T08:41:27Z")

</div>

> [@PrettyGirl](#):
>
> Я могу просто разместить его локально, если захочу.

Вы также можете использовать этот метод для локальных установок в целях разработки (это его основное назначение).

> [@PrettyGirl](#):
>
> Итак, пожалуйста, сообщите мне решение, связанное с вопросом, который я упомянул.  
> Мне нужно просто добавить пользователей (у меня есть список имен пользователей) в основную базу данных Discourse.

Почему бы вам не прочитать код этой rake-задачи и не изменить его по своему усмотрению?

> <https://github.com/discourse/discourse/blob/main/lib/tasks/dev.rake>

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [10.Октябрь.2023 09:49:42 UTC](https://meta.discourse.org/t/bulk-creating-users-with-rails-etc/281716/5 "2023-10-10T09:49:42Z")

</div>

Рекомендую вам посмотреть скрипты импорта в папке script/import\_scripts и найти тот, который читает CSV-файлы.

Я планировал создать скрипт или плагин, который позволит создавать объекты из электронной таблицы, но другие работы помешали.

---

<div class="post-metadata">

### Author: ![PrettyGirl](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/prettygirl/32/330415_2.png) [@PrettyGirl](https://meta.discourse.org/u/PrettyGirl)
#### Post date: [10.Октябрь.2023 10:56:29 UTC](https://meta.discourse.org/t/bulk-creating-users-with-rails-etc/281716/6 "2023-10-10T10:56:29Z")

</div>

Я внес изменения в код, но в продакшн-окружении в Docker-контейнере я создал файл Rake с помощью команды `touch` и отредактировал его в `nano`, затем зашел в приложение через `./launcher enter app`, вошел в Rails и проверил `rake -T`, однако файл Rake не загрузился. Это моя главная проблема. Я даже не могу протестировать файл в продакшн-окружении.

Однако в локальной среде проблем нет: я просто скопировал и вставил файл в `lib/tasks`, и всё работает. Docker и Docker-контейнеры вызывают боль, когда нужно получить прямой доступ к чему-либо. И я не могу понять, почему файл не загружается автоматически в список задач Rake.

Поэтому я всё ещё застрял в продакшн-окружении, так как файл Rake не загружается автоматически, и я не могу выполнить команду.

Ваша поддержка не поможет, если я не буду использовать Docker. Иначе я бы с радостью отказался от Docker и разместил сайт напрямую. Это значительно упростило бы жизнь.

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [10.Октябрь.2023 12:20:57 UTC](https://meta.discourse.org/t/bulk-creating-users-with-rails-etc/281716/7 "2023-10-10T12:20:57Z")

</div>

Обычно задачи Rake тестируются в среде разработки и могут быть развернуты как часть плагина.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [10.Октябрь.2023 12:46:46 UTC](https://meta.discourse.org/t/bulk-creating-users-with-rails-etc/281716/8 "2023-10-10T12:46:46Z")

</div>

Если у вас это работает локально, вы можете создать резервную копию там и восстановить её на продакшене.

Вы поместили ваш файл в /var/www/discourse/lib/rake внутри контейнера?

---

<div class="post-metadata">

### Author: ![PrettyGirl](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/prettygirl/32/330415_2.png) [@PrettyGirl](https://meta.discourse.org/u/PrettyGirl)
#### Post date: [13.Октябрь.2023 02:52:48 UTC](https://meta.discourse.org/t/bulk-creating-users-with-rails-etc/281716/9 "2023-10-13T02:52:48Z")

</div>

Проблема в том, что при загрузке локальной резервной копии на рабочий сайт она заменит всё содержимое, которое я создал на рабочем сайте. У меня есть локальная копия, но кто-то на этом форуме посоветовал мне вести разработку на рабочем сайте. Поэтому я сейчас разрабатываю на рабочем сайте (хотя он ещё официально не опубликован).

Я поместил файл в `lib/tasks`, и локальная копия работает, а рабочая — нет. Я также попробую `lib/rake`.

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [13.Октябрь.2023 07:03:07 UTC](https://meta.discourse.org/t/bulk-creating-users-with-rails-etc/281716/10 "2023-10-13T07:03:07Z")

</div>

Не следует разрабатывать на работающем сайте.

Разработка ведётся локально, изменения упаковываются в компонент темы или плагин, а затем развёртываются на работающем сайте.

Вот пример задачи rake в плагине:

> **[discourse-chatbot/lib/tasks at main · merefield/discourse-chatbot](https://github.com/merefield/discourse-chatbot/tree/main/lib/tasks)**
>
> main/lib/tasks

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [14.Октябрь.2023 18:30:26 UTC](https://meta.discourse.org/t/bulk-creating-users-with-rails-etc/281716/11 "2023-10-14T18:30:26Z")

</div>

> [@merefield](#):
>
> Не следует разрабатывать на работающем сайте.

Я считаю, что не стоит разрабатывать на Rails или Ember в стандартной установке, но я регулярно выполняю импорт в контейнере продакшена. Поскольку это просто задача Rake, вам даже не нужно перезапускать сервер, чтобы изменения вступили в силу.

Так как это не публично, должно быть безопасно откатиться к резервной копии, если что-то пойдет не так. Вероятно, именно там я бы это делал.

Вы можете сделать резервную копию работающего сайта, восстановить её на тестовом сайте, выполнить работу, а затем сделать резервную копию и восстановить обратно на работающий сайт.
