Sono stato in grado di riprodurre il problema sul mio sito Discourse locale aggiungendo un tag all’impostazione del sito tag da sopprimere nel digest e quindi creando un argomento con più tag.
Il seguente codice causa il 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
Modifica: Non penso che sia necessaria una LEFT JOIN qui. Le colonne dalla tabella topic_tags unita non sembrano essere utilizzate successivamente nel metodo. La correzione potrebbe essere semplice come:
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
Lascerò che il team di Discourse capisca l’approccio migliore. Il metodo for_digest viene eseguito molte volte e deve essere efficiente.