Сбросить настройки категорий по умолчанию

Я думаю, что следующие шаги решили проблему!

В настройках сайта я установил категорию (31) как отслеживаемую по умолчанию, ретроспективно.
Проверка:

CategoryUser.where(category_id: 31).pluck(:user_id, :notification_level)

У большинства пользователей notification_level для моей категории 31 равен 3. :+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)