nathank
(Nathan Kershaw)
1
UIからは一度に1つしか実行できないため、ほとんど使用されていないカテゴリをいくつか廃止するために、多くのトピックをグループPMに変換することを計画しています。一括で実行する方法も見つかりません。
コンソール経由でこれが機能するはずです。
- カテゴリでトピックを特定します。
topic.archetype を private_message に変更します。
topic.subtype を ‘user_to_user’ に変更します。
topic.category を Null にします。
topic_groups (または topic_allowed_groups) に、関連する group_id と topic_id を持つ行を追加します。
このアプローチは理にかなっていますか?もちろん、これらのトピック/グループテーブルの違いを最初に突き止める必要があります。そして、まずはサンドボックスで実行します!!
「いいね!」 1
pfaffman
(Jay Pfaffman)
2
それはうまくいくかもしれません。また、もしご存知なければ、以下のようなこともできます。
topics = Topic.where(category: 10)
topics.update_all(archetype: xxx, topic_category: nil)
あるいは、そのようなものです。もし update_all についてご存知であれば、これは新しい情報ではありません。
「いいね!」 2
nathank
(Nathan Kershaw)
3
ジェイ、ありがとうございます!前半はそれで十分速いです。しかし、最終的にグループPMになることも保証しなければなりません。
topic_groups / topic_allowed_groupsテーブルについて、何かアイデアはありますか? update_allで済ませることはできないと思います。
「いいね!」 1
nathank
(Nathan Kershaw)
4
その後(ずいぶん時間がかかりましたが!)、これを実現する方法を2つ見つけました。UIから行う方法があり、これは小さなカテゴリ(および小さなグループ)にはうまく機能します。その際、不必要な通知を発しないように注意が必要ですが、十分可能です。
あるいは、セルフホストしている場合は、Railsコンソールを使用する方法があり、こちらはより高速で強力です。
UIから
- グループから他のメンバーを削除します(ただし、後で簡単に追加できるようにユーザー名/メールアドレスのリストは保持します)。これにより、彼らに通知が送信されるのを防ぎます。
- カテゴリ内の各トピックを、管理者スパナメニューを使用してPM(プライベートメッセージ)に変換するために順に処理します。
- 個々のトピックを別々のタブで開き、一つずつ進めるのが最も簡単だとわかりました。
- 各トピック(現在はPM)にグループを追加します。
- グループメンバーをグループに再度追加します。
- 必要に応じて、各グループメッセージ内の「小さな投稿」を整理/削除します。
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