Converter tópicos em massa de uma Categoria para Mensagens Privadas de Grupo

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:

  1. Identificar os tópicos por sua categoria
  2. Alterar topic.archetype para private_message
  3. Alterar topic.subtype para 'user_to_user'
  4. Tornar topic.category Null
  5. 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!!

1 curtida

Isso poderia funcionar. Além disso, se você não souber, pode fazer algo como

 tópicos = Tópico.where(categoria: 10)

  tópicos.update_all(arquétipo: xxx, categoria_tópico: nil)

Ou algo assim. Se você soubesse sobre update_all, isso não é novidade.

2 curtidas

Obrigado, Jay! Isso seria bom e rápido para a primeira metade. No entanto, também preciso garantir que eles acabem como Gerentes de Grupo (Group PMs).

Alguma ideia do que preciso fazer com as tabelas topic_groups / topic_allowed_groups? Não acho que possa resolver com um update_all para elas.

1 curtida

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)

  1. 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.
  2. 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
  3. Adicione o Grupo a cada um dos Tópicos (agora PMs)
  4. Adicione os membros do Grupo de volta ao grupo
  5. 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)

1 curtida