nathank
(Nathan Kershaw)
1
我计划将一系列主题转换为群组 PM,以弃用一些很少使用的类别。我们无法通过用户界面执行此操作(一次只能一个),也找不到批量执行的方法。
据我所知,这应该可以通过控制台完成:
- 按类别识别主题
- 将 topic.archetype 更改为
private_message
- 将 topic.subtype 更改为 ‘user_to_user’
- 将 topic.category 设为
Null
- 在 topic_groups(或可能是 topic_allowed_groups)中,添加一行包含相关 group_id 和 topic_id
这种方法有意义吗?当然,我需要先弄清楚这些 topic/groups 表之间的区别。并且首先在沙盒中进行!!
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
谢谢 Jay!这在前一半会很方便快捷。但是,我也必须确保他们最终成为 Group PM。
关于 topic_groups / topic_allowed_groups 表,你有什么想法吗?我不认为我可以用 update_all 来处理它们。
1 个赞
nathank
(Nathan Kershaw)
4
我后来(显然花了一段时间!)想出了两种实现此目的的方法。您可以通过用户界面(UI)进行操作,这对于小型分类(和小型群组)效果很好。在执行此操作时,需要小心避免触发不必要的通知,但这非常可行。
或者,如果您是自托管用户,可以使用 Rails 控制台,它更快、功能更强大。
从用户界面操作
- 将群组中的其他成员从群组中移除(但保留用户名/电子邮件列表以便您轻松重新添加他们)。这将避免他们收到通知。
- 遍历分类中的每个主题,使用管理员的扳手菜单将每个主题转换为私信(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 个赞