Redefinir configuração de categorias padrão de visualização

Acho que os passos abaixo resolveram o problema!

Nas configurações do site, defini a categoria (31) para ser observada por padrão, retroativamente.
Verificar:

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

A maioria dos usuários tem um notification_level de 3 para minha categoria 31. :+1:

Agora há duas coisas no caminho para que esta mudança tenha um efeito de 100%:

  1. As preferências globais de e-mail do usuário.
  2. As preferências de notificação do usuário para cada tópico na categoria (31).

:warning: As linhas a seguir modificarão as configurações pessoais dos seus usuários. Não entre em uma briga.

Primeiro, para “reativar” os e-mails dos usuários, é preciso definir o email_level dos usuários como 1 (ou seja, “quando ausente”) ou 2 (“sempre”):

UserOption.update_all(email_level: 1)

Verificar:

UserOption.group(:email_level).count

Eu obtenho algo como => {1=>X} com X sendo o número de usuários.

Segundo, o notification_level do tópico tem prioridade sobre o notification_level da categoria (que foi modificado nas configurações do site). A maneira mais fácil é remover as preferências do tópico do caminho. Para fazer isso, basta excluir as entradas tópico por tópico:

TopicUser.where(topic_id: <nr_do_tópico>).destroy_all

Verificar:

TopicUser.where(topic_id: <nr_do_tópico>).exists?

Obtendo algo como => [ ] o que significa que nenhum usuário tem preferências de tópico e o notification_level da categoria será o padrão para todos os usuários.


N.B.: De alguma forma, alguns usuários ainda não tinham preferências de notificação para a categoria (31) definidas (ou seja, nenhuma entrada na tabela category_user). Para garantir que seu notification_level esteja definido, é preciso criar uma entrada com o valor para 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

Verificar:

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