Вот ещё один пример, который был отправлен на тестовую учётную запись неактивного пользователя:
последний визит: 2024-09-12
частота дайджеста: ежедневно
«Включать контент от новых пользователей в сводные письма»: отмечено
нет скрытых релевантных тегов
Популярные темы:
«ИИ — чем больше, тем лучше?» — повторено 3 раза. Тема содержит 3 тега, 0 ответов, 0 лайков.
«Задачи по социальной инженерии» — повторено 2 раза. Тема содержит 2 тега, 1 ответ, 0 лайков.
Новое для вас:
«Новые запросы тегов» — не повторялось. Тема содержит 0 тегов, 0 ответов, 0 лайков.
В последнем дайджесте, который получил один из моих аккаунтов, темы не дублировались, но комментарии под ними (раздел «Популярные посты») повторялись. Было пять слотов, из которых два были дубликатами (три уникальных поста), и оба дубликата относились к одной и той же теме.
Редакция: Я просматриваю некоторые исторические дайджесты, отправленные разным тестовым/администраторским аккаунтам:
В предыдущем также было два дубликата в разделе «Популярные посты», и они тоже касались той же темы.
В дайджесте перед ним был дубликат темы, но не было дубликатов в разделе «Популярные посты». Однако дубликат присутствовал в разделе «Новое для вас».
@j127, было бы интересно узнать, сколько тегов было у ваших тем в дайджесте. В моих недавних выборках дублирование соответствует количеству тегов у темы. Возможно, это совпадение, а может, и нет.
Мне удалось воспроизвести проблему на локальном сайте Discourse, добавив тег в настройку сайта digest suppress tags, а затем создав тему с несколькими тегами.
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
Редактирование: Мне кажется, что LEFT JOIN здесь не нужен. Столбцы из присоединённой таблицы topic_tags, похоже, не используются дальше в методе. Исправление может быть таким простым:
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
Я оставлю команде Discourse решение о выборе наилучшего подхода. Метод for_digest выполняется очень часто и должен быть эффективным.
@simon — огромное спасибо за то, что разобрались в этом! Уверен, что было много информации для анализа. С нетерпением жду, когда команда Discourse вернётся и примет меры по вашему анализу.
Я не совсем понимаю, когда объединённые коммиты появятся в бета-канале. Если я нахожусь на версии 3.4.0.beta3-dev (53f9c81790) и обновление GUI не предлагается, загрузит ли обновление через командную строку это изменение?