カテゴリのトピックを一括でグループPMに変換する

UIからは一度に1つしか実行できないため、ほとんど使用されていないカテゴリをいくつか廃止するために、多くのトピックをグループPMに変換することを計画しています。一括で実行する方法も見つかりません。

コンソール経由でこれが機能するはずです。

  1. カテゴリでトピックを特定します。
  2. topic.archetypeprivate_message に変更します。
  3. topic.subtype を ‘user_to_user’ に変更します。
  4. topic.categoryNull にします。
  5. topic_groups (または topic_allowed_groups) に、関連する group_idtopic_id を持つ行を追加します。

このアプローチは理にかなっていますか?もちろん、これらのトピック/グループテーブルの違いを最初に突き止める必要があります。そして、まずはサンドボックスで実行します!!

「いいね!」 1

それはうまくいくかもしれません。また、もしご存知なければ、以下のようなこともできます。

 topics = Topic.where(category: 10)

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

あるいは、そのようなものです。もし update_all についてご存知であれば、これは新しい情報ではありません。

「いいね!」 2

ジェイ、ありがとうございます!前半はそれで十分速いです。しかし、最終的にグループPMになることも保証しなければなりません。

topic_groups / topic_allowed_groupsテーブルについて、何かアイデアはありますか? update_allで済ませることはできないと思います。

「いいね!」 1

その後(ずいぶん時間がかかりましたが!)、これを実現する方法を2つ見つけました。UIから行う方法があり、これは小さなカテゴリ(および小さなグループ)にはうまく機能します。その際、不必要な通知を発しないように注意が必要ですが、十分可能です。

あるいは、セルフホストしている場合は、Railsコンソールを使用する方法があり、こちらはより高速で強力です。

UIから

  1. グループから他のメンバーを削除します(ただし、後で簡単に追加できるようにユーザー名/メールアドレスのリストは保持します)。これにより、彼らに通知が送信されるのを防ぎます。
  2. カテゴリ内の各トピックを、管理者スパナメニューを使用してPM(プライベートメッセージ)に変換するために順に処理します。
    • 個々のトピックを別々のタブで開き、一つずつ進めるのが最も簡単だとわかりました。
  3. 各トピック(現在はPM)にグループを追加します。
  4. グループメンバーをグループに再度追加します。
  5. 必要に応じて、各グループメッセージ内の「小さな投稿」を整理/削除します。

Railsコンソールで

コンソールにアクセスするには、コンテナに入り、コンソールを呼び出します。

./launcher enter app
  rails c

カテゴリとグループを設定し、以下のスクリプトをコンソールにコピーします。

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

これはユーザーに一切通知せず、投稿に参加しているユーザーを適切に保持します(ユーザーがグループに含まれていない場合でも)。

「いいね!」 1