Múltiplas entradas repetidas de resumo por e-mail

Consegui reproduzir o problema em meu site Discourse local adicionando uma tag à configuração do site digest suppress tags e, em seguida, criando um tópico com várias tags.

O código a seguir causa o problema: discourse/app/models/topic.rb at main · discourse/discourse · GitHub

    if SiteSetting.digest_suppress_tags.present?
      tag_ids = Tag.where_name(SiteSetting.digest_suppress_tags.split("|")).pluck(:id)
      if tag_ids.present?
        topics =
          topics.joins("LEFT JOIN topic_tags tg ON topics.id = tg.topic_id").where(
            "tg.tag_id NOT IN (?) OR tg.tag_id IS NULL",
            tag_ids,
          )
      end
    end

Editar: Não acho que um LEFT JOIN seja necessário aqui. As colunas da tabela topic_tags unida não parecem ser usadas posteriormente no método. A correção pode ser tão simples quanto:

if SiteSetting.digest_suppress_tags.present?
tag_ids = Tag.where_name(SiteSetting.digest_suppress_tags.split("|")).pluck(:id)
  if tag_ids.present?
  topics =
    topics.where.not(id: TopicTag.where(tag_id: tag_ids).select(:topic_id))
  end
end

Deixarei para a equipe do Discourse descobrir a melhor abordagem. O método for_digest é executado muitas vezes e precisa ser eficiente.

4 curtidas