Convertir masivamente temas de una Categoría a Mensajes Privados de Grupo

Planeo convertir una serie de temas en mensajes grupales para depreciar algunas categorías que apenas se usan. No podemos hacer eso a través de la interfaz de usuario (solo uno por uno), ni he encontrado una forma masiva de hacerlo.

Hasta donde puedo ver, esto debería funcionar a través de la consola:

  1. Identificar los temas por su categoría
  2. Cambiar topic.archetype a private_message
  3. Cambiar topic.subtype a 'user_to_user'
  4. Hacer que topic.category sea Null
  5. En topic_groups (o quizás topic_allowed_groups), agregar una línea con el group_id y topic_id relevantes

¿Tiene sentido este enfoque? Necesito averiguar la diferencia entre esas tablas de temas/grupos primero, por supuesto. ¡Y hacerlo en un entorno de pruebas para empezar!

1 me gusta

Eso podría funcionar. Además, si no lo sabes, puedes hacer algo como

 topics = Topic.where(category: 10)

  topics.update_all(archetype: xxx, topic_category: nil)

O algo así. Si sabías sobre update_all, esto no es noticia.

2 Me gusta

¡Gracias Jay! Eso sería bueno y rápido para la primera mitad. Sin embargo, también tengo que asegurarme de que terminen como Group PMs.

¿Alguna idea de qué tengo que hacer con las tablas topic_groups / topic_allowed_groups? No creo que pueda salirme con la mía con un update_all para ellas.

1 me gusta

Desde entonces (¡claramente tomó un tiempo!) he encontrado dos maneras de lograr esto. Puedes hacerlo a través de la interfaz de usuario (UI), lo que funciona bien para Categorías pequeñas (y grupos pequeños). Requiere algo de cuidado para evitar enviar notificaciones inútiles mientras lo haces, pero es muy factible.

Alternativamente, puedes usar la Consola de Rails (asumiendo que te autoalojas), que es más rápida y mucho más potente.

Desde la UI

  1. Elimina a los otros miembros del grupo del Grupo (pero conserva una lista de nombres de usuario/correos electrónicos para poder volver a añadirlos fácilmente). Esto evitará que sean notificados.
  2. Recorre cada tema en la Categoría, convirtiéndolo en un Mensaje Privado (PM) usando el menú de la llave inglesa de administrador
    • Encuentro que es más fácil hacer esto abriendo cada tema en su propia pestaña y luego moviéndome entre ellos uno por uno
  3. Añade el Grupo a cada uno de los Temas (ahora PMs)
  4. Vuelve a añadir los miembros del Grupo al grupo
  5. Ordena/elimina todas las ‘publicaciones pequeñas’ en cada Mensaje de Grupo según sea necesario

En la Consola de Rails

Accede a la consola entrando al contenedor y luego llamando a la consola:

./launcher enter app
  rails c

Establece la Categoría y el Grupo, y luego copia el siguiente script en la consola:

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

Esto no notifica a los usuarios en absoluto, y conserva muy bien a los usuarios que participan en las publicaciones (por si acaso no están en el Grupo)

1 me gusta