重置默认类别观看设置

您好,

我试图重置所有用户的“默认类别关注”,但没有成功。

尽管在设置区域似乎没有选择任何类别,但用户的偏好中却选择了一些类别。

2 个赞

你好 @ufukayyildiz

你是否找到了处理此问题的办法?我在尝试同样操作时也遇到了一些麻烦,结果完全无法工作 ^^ 参见 Members not receiving emails from Watched category (again)

3 个赞

还没有。

2 个赞

我相信它的设计是为了让设置尊重用户的选择。因此,如果用户手动添加了一个类别,它就不会被覆盖。

你或许可以从 Rails 控制台做些什么,但我认为更好的方法是教育你的用户。你觉得呢?或者你是否有必须更改默认设置的特定情况?

1 个赞

感谢您的回复。

如果能提供一个 Rails 控制台命令来复制用户偏好设置,我将非常感激。我完全理解用户偏好设置优先于站点设置的设计选择。但问题在于站点及其组织方式在不断发展。

在我们的案例中,我们从一个将所有公告发布为新主题的组织方式,转变为另一种组织方式:结果是首页上出现了大量未讨论的主题(仅1帖)。我注意到我早在 2023 年 2 月就开始研究这个问题了 Unlist or archive a post when it has no reply per category

由于这些公告很重要并且包含截止日期,因此不能选择将它们隐藏在首页之外。所以我们迁移到了一个包含 5 个专用主题(公告类型)的组织方式,每个帖子都是一个新的公告。[^1] 同样,由于这些帖子很重要,我们尝试将类别设置为“关注”,以便实时通知用户。

这便是目前导致除了 user_mentioneddigest 之外,没有人收到任何通知的情况的开端。如果能够重置所有用户偏好设置以使用新的站点默认设置,那么迁移将会容易得多。或者,作为另一个想法,可以将一个虚拟新注册用户的偏好设置复制到所有其他用户。[^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_level3:+1:

现在,此更改要产生 100% 的效果还有两件事:

  1. 用户的全局电子邮件偏好设置。
  2. 用户在类别(31)中每个主题的通知偏好设置。

:warning: 以下行将修改您用户的个人设置。不要发生争执。

首先,为了“重新激活”用户的电子邮件,必须将用户的 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)