Como parte de uma migração/fusão de Discourse para Discourse, estou tentando excluir todos os usuários que não estão em um grupo específico.
Tentei o seguinte no console do Rails: User.joins(:group_users).where.not(group_users:{group_id:135}).destroy_all
Infelizmente, isso excluiu todos os usuários, o que foi um grande problema!
Encontrei uma maneira complicada de fazer isso usando a interface e algum código Rails feio, mas existe uma maneira mais fácil? Provavelmente apenas errei a sintaxe.
Aqui está o que tentei, depois de dolorosamente criar um mega grupo com aqueles a serem excluídos (cerca de 6000) via GUI:
rails c
target_group = Group.find_by_name("nz-not")
users = User.joins(:group_users).where(group_users:{group_id: target_group.id})
users.each do |u|
u.destroy
end
exit
Além disso, qual é a diferença entre usar destroy e UserDestroyer? Deveria estar usando o último?
Respondendo à minha própria pergunta, tendo aprendido algumas lições.
Sim, use UserDestroyer ou seu banco de dados ficará cheio de registros órfãos.
Você pode precisar ser esperto sobre como reunir seus usuários indesejados. Usei esta consulta do Data Explorer para obter uma lista deles, que então adicionei em massa a um grupo chamado unwanted.
WITH included_users AS (
SELECT
gu.user_id
FROM group_users gu
JOIN groups g
ON g.id = gu.group_id
WHERE g.name = :included_group
),
excluded_users AS (
SELECT
gu.user_id
FROM group_users gu
JOIN groups g
ON g.id = gu.group_id
WHERE g.name = :excluded_group
)
SELECT
u.id AS user_id, u.username
FROM users as u
WHERE u.id in (SELECT user_id FROM included_users)
AND u.id NOT IN (SELECT user_id FROM excluded_users)
GROUP by u.id
Como destruir muitos usuários:
Entre no aplicativo Discourse (./launcher enter app, etc) e execute os seguintes comandos:
rails c
target_group = Group.find_by_name("unwanted")
users = User.joins(:group_users).where(group_users:{group_id: target_group.id})
users.each do |u|
u.admin = false
u.moderator = false
u.save
UserDestroyer.new(Discourse.system_user).destroy(u, delete_posts: true)
end
Exit