您好,
我试图重置所有用户的“默认类别关注”,但没有成功。
尽管在设置区域似乎没有选择任何类别,但用户的偏好中却选择了一些类别。
你是否找到了处理此问题的办法?我在尝试同样操作时也遇到了一些麻烦,结果完全无法工作 ^^ 参见 Members not receiving emails from Watched category (again)
还没有。
我相信它的设计是为了让设置尊重用户的选择。因此,如果用户手动添加了一个类别,它就不会被覆盖。
你或许可以从 Rails 控制台做些什么,但我认为更好的方法是教育你的用户。你觉得呢?或者你是否有必须更改默认设置的特定情况?
感谢您的回复。
如果能提供一个 Rails 控制台命令来复制用户偏好设置,我将非常感激。我完全理解用户偏好设置优先于站点设置的设计选择。但问题在于站点及其组织方式在不断发展。
在我们的案例中,我们从一个将所有公告发布为新主题的组织方式,转变为另一种组织方式:结果是首页上出现了大量未讨论的主题(仅1帖)。我注意到我早在 2023 年 2 月就开始研究这个问题了 Unlist or archive a post when it has no reply per category
由于这些公告很重要并且包含截止日期,因此不能选择将它们隐藏在首页之外。所以我们迁移到了一个包含 5 个专用主题(公告类型)的组织方式,每个帖子都是一个新的公告。[^1] 同样,由于这些帖子很重要,我们尝试将类别设置为“关注”,以便实时通知用户。
这便是目前导致除了 user_mentioned 和 digest 之外,没有人收到任何通知的情况的开端。如果能够重置所有用户偏好设置以使用新的站点默认设置,那么迁移将会容易得多。或者,作为另一个想法,可以将一个虚拟新注册用户的偏好设置复制到所有其他用户。[^2]
与此同时,我已经告知用户系统有时无法按预期工作,并且通知电子邮件将在不确定的时间内无法发送。
[^1] 在这里,能够仅启用“回复主题”将非常有帮助。
[^2] 我可以想象这目前可以通过 Rails 实现。
你好。我还在研究这个问题,在我们的案例中,重置用户偏好设置是有意义的,因为网站的结构已经改变,导致电子邮件通知的工作方式也发生了变化。
从 discourse AI,我得到了以下 rails 命令建议:
UserOption.update_all(email_digests: true, email_level: 1, email_messages_level: 1)
你认为这能达到我们想要的效果吗?
谢谢!
我认为以下步骤解决了该问题!
在站点设置中,我将类别(31)设置为默认监视,追溯性地设置。
检查:
CategoryUser.where(category_id: 31).pluck(:user_id, :notification_level)
我的类别 31 的大多数用户的 notification_level 为 3。![]()
现在,此更改要产生 100% 的效果还有两件事:
以下行将修改您用户的个人设置。不要发生争执。
首先,为了“重新激活”用户的电子邮件,必须将用户的 email_level 设置为 1(即“离开时”)或 2(“始终”):
UserOption.update_all(email_level: 1)
检查:
UserOption.group(:email_level).count
我得到类似 => {1=>X} 的结果,其中 X 是用户数。
其次,主题 notification_level 优先于类别 notification_level(已在站点设置中修改)。最简单的方法是移除主题首选项。为此,只需逐个删除条目:
TopicUser.where(topic_id: <topic_id_nr>).destroy_all
检查:
TopicUser.where(topic_id: <topic_id_nr>).exists?
得到类似 => [ ] 的结果,这意味着没有用户具有主题偏好设置,类别 notification_level 将是所有用户的默认设置。
附注:不知何故,一些用户仍然没有设置类别的通知偏好设置(31)(即 category_user 表中没有条目)。为了确保设置了他们的 notification_level,必须创建一个带有 notification_level 值的条目:
User.find_each do |user|
unless CategoryUser.exists?(user_id: user.id, category_id: 31)
CategoryUser.create!(user_id: user.id, category_id: 31, notification_level: 3)
end
end
检查:
CategoryUser.where(category_id: 31).pluck(:id, :notification_level)