Db:seed_fu не работает в 002_groups.rb при обновлении: Ошибка валидации: Имя уже занято

Возникла проблема при обновлении с версии v2026.3.0-latest. Задача rake db:seed_fu завершается ошибкой при выполнении файла 002_groups.rb со следующим сообщением:

ActiveRecord::RecordInvalid: Validation failed: Name has already been taken. (ActiveRecord::RecordInvalid)

Сбой происходит именно в тот момент, когда скрипт инициализации пытается создать новые системные группы (ID 4: anonymous и ID 5: logged_in_users).

Это подтверждено через консоль Rails. Ручная проверка завершается ошибкой валидации, но игнорирование валидации позволяет записать запись в базу данных без каких-либо проблем:

# Это завершается ошибкой «Name has already been taken»
g = Group.new(id: 4, name: «anonymous», automatic: true)
g.valid?

# Это работает корректно, что доказывает отсутствие реального конфликта
g.save(validate: false)

Мне удалось преодолеть это препятствие, вручную создав эти новые системные группы:

ActiveRecord::Base.transaction do
  g4 = Group.new(id: 4, name: "anonymous", automatic: true)
  g4.save(validate: false)

  g5 = Group.new(id: 5, name: "logged_in_users", automatic: true)
  g5.save(validate: false)
end

Теперь при запуске rake db:seed_fu задача выполняется без ошибок.

Куда исчезла кнопка «Мне тоже!»?

Это происходит, когда у вас уже существует группа или пользователь (!!!) с именем anonymous.

У нас есть множество форумов, где anonymous использовалось как имя пользователя после импорта.

В коммите упоминается:

Этот PR вводит две новые автоматические группы: anonymous_users и logged_in_users

но, похоже, группа в итоге была названа anonymous без _users.

Это досадно, потому что:

  • anonymous неясно: это группа пользователей или отдельный пользователь;
  • риск конфликта с существующей группой или пользователем значительно выше без _users.

Предлагаемые решения:

  1. Назвать группу anonymous_users, как и планировалось изначально; это больше соответствует logged_in_users и значительно снижает риск конфликтов.
  2. Как минимум обнаруживать конфликт и переименовывать существующего пользователя или группу вместо того, чтобы выдавать ошибку.
1 лайк