Db:seed_fu falha em 002_groups.rb durante a atualização: Validação falhou: Nome já foi registrado

Encontrei um problema ao atualizar a partir de v2026.3.0-latest. A tarefa rake db:seed_fu falha ao atingir 002_groups.rb com o seguinte erro:

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

A falha ocorre exatamente quando o seedador tenta inicializar os novos grupos do sistema (ID 4: anonymous e ID 5: logged_in_users).

Confirmei isso no console do Rails. Uma verificação manual falha na validação, mas contornando a validação, o banco de dados aceita o registro sem problemas:

# Isso falha com „Name has already been taken"
g = Group.new(id: 4, name: „anonymous", automatic: true)
g.valid?

# Isso funciona perfeitamente, provando que não há conflito real
g.save(validate: false)

Consegui superar esse obstáculo criando manualmente esses novos grupos do sistema:

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

Agora, ao executar rake db:seed_fu, o processo é concluído sem erros.

2 curtidas

Para onde foi o botão “Eu também!”?

Isso acontece quando você já possui um grupo ou usuário (!!!) chamado anonymous.

Temos muitos fóruns onde anonymous foi usado como nome de usuário após uma importação.
O commit menciona

Este PR introduz dois novos grupos automáticos: anonymous_users e logged_in_users

mas, aparentemente, o grupo acabou sendo chamado de anonymous sem o _users.

Isso é uma pena porque:

  • anonymous deixa incerto se é um grupo de usuários ou um único usuário
  • o risco de conflito com um grupo ou usuário existente é muito maior sem o _users

Soluções sugeridas:
1 - nomear o grupo como anonymous_users afinal, está mais alinhado com logged_in_users e reduz enormemente o risco de conflito
2 - pelo menos detectar o conflito e renomear o usuário ou grupo existente em vez de gerar um erro

2 curtidas

Vou dar uma olhada nisso.

Existe uma migração para lidar com esse conflito de nomes, então não sei por que não está funcionando no caso do OP:

Você está executando isso isoladamente antes de rodar as migrações?

Sua migração verifica os grupos existentes. No entanto, ela também deve verificar os usuários existentes, pois usuários e grupos compartilham um mesmo namespace e não é possível ter um grupo com o mesmo nome de um usuário.

Hmm, tudo bem, isso é bem chato… Estou abrindo um PR agora para fazer isso:

O que, como você disse, deve reduzir drasticamente a chance de colisão. Duvido muito que exista algum usuário chamado anonymous_users, então não acho que seja necessária uma verificação ou migração automatizada se eu fizer essa renomeação.

1 curtida

Certo, isso deve resolver o problema. Também corrige algumas questões relacionadas à lógica de mudança iminente para Granular group-based permissions for anonymous and logged in users :

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

2 curtidas

Inicialmente, não. Ele estava falhando nas migrações durante o processo padrão de reconstrução, foi assim que o problema foi chamado à minha atenção inicialmente e eu o rastreie. Depois, eu estava executando a tarefa rake manualmente para solucionar o problema.

2 curtidas

Tudo bem, já fundi o PR. Deve resolver os conflitos de nome.

1 curtida

Essa é uma ótima notícia!

Você poderia, por favor, também fazer o backport da correção para 2026.5?

Feito aqui DEV: Rename anonymous group to anonymous_users (#40435) by martin-brennan · Pull Request #40629 · discourse/discourse · GitHub

1 curtida