nathank
(Nathan Kershaw)
1
거의 사용되지 않는 카테고리들을 비활성화하기 위해 여러 토픽을 그룹 DM으로 변환할 계획입니다. UI에서는 이를 일괄 처리할 수 없으며(하나씩만 가능), 일괄 처리 방법을 찾을 수도 없었습니다.
제가 파악한 바로는, 콘솔을 통해 다음과 같이 처리하면 작동할 것 같습니다:
- 카테고리를 기준으로 토픽을 식별합니다.
topic.archetype을 private_message로 변경합니다.
topic.subtype을 'user_to_user’로 변경합니다.
topic.category를 Null로 설정합니다.
topic_groups(또는 topic_allowed_groups) 테이블에 관련 group_id와 topic_id가 포함된 행을 추가합니다.
이 접근 방식이 적절한지 궁금합니다. 물론 먼저 해당 토픽/그룹 테이블 간의 차이를 파악해야 하며, 처음에는 샌드박스 환경에서 테스트해야 합니다!!
pfaffman
(Jay Pfaffman)
2
그렇게 하면 될 것 같네요. 그리고 만약 모르고 있다면, 이런 식으로 할 수도 있어요.
topics = Topic.where(category: 10)
topics.update_all(archetype: xxx, topic_category: nil)
이런 식으로요. update_all에 대해 알고 있었다면, 이건 새로운 정보가 아니죠.
nathank
(Nathan Kershaw)
3
제이, 고마워요! 첫 번째 단계에서는 그게 좋고 빠를 거예요. 하지만 그들을 그룹 PM으로 만들어야 한다는 점도 확인해야 해요.
topic_groups / topic_allowed_groups 테이블에 대해 뭘 해야 할지 아이디어가 있으신가요? 이 테이블들은 update_all만으로는 해결할 수 없을 것 같아요.
nathank
(Nathan Kershaw)
4
그 후로 (분명 시간이 좀 걸렸지만!) 이를 달성하는 두 가지 방법을 찾아냈습니다. 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
이 방법은 사용자에게 전혀 알림을 보내지 않으며, 게시물을 작성한 사용자들을 잘 보존합니다 (만약 그들이 그룹에 속해 있지 않은 경우를 대비하여).
참고로, 백그라운드 작업이 모든 것을 다시 계산하기 전에 카테고리를 삭제하려면 Rails 콘솔에서 다음을 실행해야 할 수 있습니다:
Jobs::CategoryStats.new.execute(category_id: category_id)
역방향(그룹 인박스에서 카테고리로) 스크립트, 클릭하여 표시
이 스크립트는 다른 방향으로(테스트되지 않음) 잘 처리해야 합니다.
category_id = =CategoryID=
group_name = '=GroupName='
group = Group.find_by('LOWER(name) = ?', group_name.downcase)
raise "Group not found" unless group
topic_ids = TopicAllowedGroup.where(group_id: group.id).pluck(:topic_id)
topics = Topic.where(id: topic_ids, archetype: Archetype.private_message, deleted_at: nil)
topics.find_each do |topic|
topic.archetype = Archetype.default # or "regular"
topic.subtype = nil
topic.category_id = target_category_id
topic.save!
end