J’ai pu reproduire le problème sur mon site Discourse local en ajoutant une balise au paramètre de site digest suppress tags puis en créant un sujet avec plusieurs balises.
Le code suivant est la cause du problème : 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
Edit : Je ne pense pas qu’un LEFT JOIN soit nécessaire ici. Les colonnes de la table topic_tags jointe ne semblent pas être utilisées plus tard dans la méthode. La correction pourrait être aussi simple que :
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
Je laisse l’équipe Discourse trouver la meilleure approche. La méthode for_digest est exécutée de nombreuses fois et doit être efficace.