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

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

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

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

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

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

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

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

提案される解決策:

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