Pretendo converter vários tópicos em grupos de mensagens privadas (PMs) para desvalorizar algumas categorias pouco utilizadas. Não podemos fazer isso pela interface do usuário (apenas um por um), nem encontrei uma maneira em massa de fazer isso.
Pelo que pude apurar, isso deve funcionar através do console:
Identificar os tópicos por sua categoria
Alterar topic.archetype para private_message
Alterar topic.subtype para 'user_to_user'
Tornar topic.categoryNull
Em topic_groups (ou talvez topic_allowed_groups), adicionar uma linha com o group_id e topic_id relevantes
Essa abordagem faz sentido? Preciso primeiro entender a diferença entre essas tabelas de tópicos/grupos, é claro. E fazer isso em um sandbox para começar!!
Eu descobri duas maneiras de fazer isso desde então (claramente demorou um pouco!). Você pode fazer isso através da interface do usuário (UI), que funciona bem para Categorias pequenas (e grupos pequenos). Requer um pouco de cuidado para evitar disparar notificações inúteis enquanto você faz isso, mas é muito viável.
Alternativamente, você pode usar o Console Rails (assumindo que você está em auto-hospedagem), que é mais rápido e muito mais poderoso.
Pela Interface do Usuário (UI)
Remova os outros membros do grupo do Grupo (mas mantenha uma lista de nomes de usuário/e-mails para poder adicioná-los novamente facilmente). Isso evitará que eles sejam notificados.
Percorra cada tópico na Categoria, convertendo cada um em uma Mensagem Privada (PM) usando o menu de chave inglesa do administrador
Acho mais fácil fazer isso abrindo cada tópico em sua própria aba e depois passando por eles um por um
Adicione o Grupo a cada um dos Tópicos (agora PMs)
Adicione os membros do Grupo de volta ao grupo
Organize/exclua todas as ‘pequenas postagens’ em cada Mensagem de Grupo conforme desejado
No Console Rails
Acesse o console entrando no contêiner e, em seguida, chamando o console:
./launcher enter app
rails c
Defina a Categoria e o Grupo e, em seguida, copie o script abaixo no console:
category_id = =CategoryID=
group_name = '=GroupName='
group = Group.find_by('lower(name) = ?', group_name.downcase)
about_id = Category.find(category_id).topic_id
topic_ids = Topic.where(category_id: category_id).where.not(id: about_id).pluck(:id)
Topic.where(id: topic_ids).find_each do |topic|
topic.archetype = Archetype.private_message
topic.category_id = nil
topic.subtype = 'user_to_user'
topic.save!
TopicAllowedGroup.find_or_create_by!(topic_id: topic.id, group_id: group.id)
Post.where(topic_id: topic.id).pluck(:user_id).uniq.each do |uid|
TopicAllowedUser.find_or_create_by!(topic_id: topic.id, user_id: uid)
end
end
Isso não notifica os usuários de forma alguma e preserva bem os usuários participantes nas postagens (caso não estejam no Grupo)