Db:seed_fu のアップグレード中に 002_groups.rb で失敗:Validation failed: Name has already been taken

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を実行してもエラーなく完了します。

「いいね!」 2

「私も!」ボタンはどこへ行ったのですか?

これは、既存のグループまたはユーザー(!!!)が anonymous という名前で存在する場合に発生します。

インポート後に anonymous をユーザー名として使用していたフォーラムが多数あります。
コミットには以下のように記載されています。

この PR は、anonymous_users と logged_in_users という 2 つの新しい自動グループを導入します

しかし、実際にはそのグループは _users を含まずに anonymous と呼ばれることになったようです。

これは残念なことです。なぜなら

  • anonymous という名前は、それがユーザーグループなのか単一のユーザーなのかを不明確にするため
  • _users がなければ、既存のグループやユーザーとの競合リスクが大幅に高まるため

提案される解決策:

  1. グループを結局のところ anonymous_users と命名する。これは logged_in_users と一貫性があり、競合リスクを劇的に低減します
  2. 少なくとも競合を検知し、エラーを返す代わりに既存のユーザーまたはグループをリネームする
「いいね!」 2

これを調査しています。

この名前競合を処理するためのマイグレーションが存在するため、なぜ OP のケースで機能していないのか不明です:

マイグレーションを実行する前に、これを単独で実行していますか?

現在のグループを確認する移行処理ですが、ユーザーとグループは名前空間を共有しており、ユーザーと同じ名前のグループを作成できないため、既存のユーザーも確認する必要があります。

うーん、なるほど、それは確かに面倒ですね…これを処理するための PR を今すぐ作成します:

ご指摘の通り、これにより衝突の可能性が劇的に低下するはずです。anonymous_users という名前のユーザーがいるとはとても思えませんので、この名前変更を行う場合、自動チェックやマイグレーションは不要だと考えます。

「いいね!」 1

これで問題解決するはずです。また、Granular group-based permissions for anonymous and logged in users の匿名ユーザーとログインユーザー向けのきめ細やかなグループベースの権限に関する今後の変更ロジックの問題も修正されます。

https://github.com/discourse/discourse/pull/40435

「いいね!」 2

最初はいいえです。標準的なビルド再構築プロセス中にマイグレーションで失敗しており、それが最初に私の注意を引いたきっかけでした。その後、トラブルシューティングのために手動で rake タスクを実行していました。

「いいね!」 2

よし、PR をマージしました。名前衝突の問題はこれで解決するはずです。

「いいね!」 1

素晴らしいニュースですね!

また、修正を 2026.5 にもバックポートしていただけますでしょうか?