Conversione in blocco di argomenti da una Categoria a Messaggi privati di Gruppo

Ho intenzione di convertire un gruppo di argomenti in messaggi privati di gruppo per deprecare alcune categorie poco utilizzate. Non possiamo farlo tramite l’interfaccia utente (solo uno per volta), né riesco a trovare un modo per farlo in blocco.

Per quanto ne so, questo dovrebbe funzionare tramite la console:

  1. Identifica gli argomenti per la loro categoria
  2. Cambia topic.archetype in private_message
  3. Cambia topic.subtype in ‘user_to_user’
  4. Rendi topic.category Null
  5. In topic_groups (o forse topic_allowed_groups), aggiungi una riga con il group_id e il topic_id pertinenti

Questo approccio ha senso? Devo prima capire la differenza tra quelle tabelle topic/groups. E farlo prima in un ambiente sandbox!!

1 Mi Piace

Potrebbe funzionare. Inoltre, se non lo sai, puoi fare qualcosa come

 topics = Topic.where(category: 10)

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

O qualcosa del genere. Se sapevi di update_all, questa non è una novità.

2 Mi Piace

Grazie Jay! Sarebbe bello e veloce per la prima metà. Tuttavia, devo anche assicurarmi che finiscano come Group PM.

Hai qualche idea su cosa devo fare con le tabelle topic_groups / topic_allowed_groups? Non credo di poter cavarmela con un update_all per loro.

1 Mi Piace

Ho poi (ci è voluto un po’!) trovato due modi per raggiungere questo obiettivo. Puoi farlo tramite l’interfaccia utente (UI), che funziona bene per le Categorie piccole (e i gruppi piccoli). Richiede un po’ di attenzione per evitare di inviare notifiche inutili mentre lo fai, ma è fattibile.

In alternativa, puoi usare la Console Rails (supponendo che tu sia self-hosted), che è più veloce e molto più potente.

Dall’Interfaccia Utente (UI)

  1. Rimuovi gli altri membri del gruppo dal Gruppo (ma tieni un elenco di nomi utente/email in modo da poterli aggiungere di nuovo facilmente). Questo eviterà che vengano notificati.
  2. Scorri ogni argomento nella Categoria, convertendolo in un MP (Messaggio Privato) utilizzando il menu della chiave inglese dell’amministratore
    • Trovo più facile farlo aprendo ogni argomento in una scheda separata, e poi scorrendo uno per uno
  3. Aggiungi il Gruppo a ciascuno degli Argomenti (ora MP)
  4. Aggiungi di nuovo i membri del Gruppo al gruppo
  5. Pulisci/elimina tutti i “piccoli post” in ogni Messaggio di Gruppo come desiderato

Nella Console Rails

Accedi alla console entrando nel container e quindi richiamando la console:

./launcher enter app
  rails c

Imposta l’ID della Categoria e il Nome del Gruppo, quindi copia lo script seguente nella 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

Questo non notifica affatto gli utenti e conserva bene gli utenti che partecipano ai post (nel caso in cui non facciano parte del Gruppo)

1 Mi Piace