Lilly
(Lillian )
26.Август.2023 21:47:46
1
Я пока не до конца понимаю условие backfill, поэтому попросила Lola Bot объяснить.
Sam Saffron, пост:1, тема:19336:
Нижеприведённый бейдж срабатывает в момент «действия пользователя над постом», что означает, что в приложениях типа «дельта» будет передан параметр :post_ids.
SELECT p.user_id, p.id post_id, p.updated_at granted_at
FROM badge_posts p
WHERE p.like_count >= 25 AND
(:backfill OR p.id IN (:post_ids) )
Условие (:backfill OR p.id IN (:post_ids) ) позволяет нам фильтровать результаты. Когда запускается ежедневная задача, :backfill имеет значение true, поэтому сканируется весь набор данных. При запуске задач дельты :backfill равен false, а :post_ids установлен.
Я пытался настроить срабатывание в момент «действия пользователя над постом», но, возможно, мой плагин Reactions как-то этому мешает? В любом случае, ежедневное обновление будет работать и, как мне кажется, меньше повлияет на производительность.
Lilly
(Lillian )
26.Август.2023 21:58:09
3
Да, теперь мне всё это кажется вполне логичным. Мне больше нравится объяснение Сэма.
Лала, не могла бы ты немного подробнее объяснить условие backfill?
Lola Bot:
Конечно, Лилли! В Discourse параметры :backfill и :post_ids используются при выполнении запросов для выдачи значков. Они определяют, какие публикации учитываются при награждении значком.
:backfill — это булев параметр. Если :backfill равен true, запрос на выдачу значка выполняется для всех подходящих публикаций в базе данных. Это обычно делается при создании нового значка или когда нужно пересчитать, кто должен получить значок, основываясь на всех исторических данных.
:post_ids — это список идентификаторов публикаций. Если :backfill равен false, запрос выполняется только для тех публикаций, чьи ID входят в список :post_ids. Это обычно используется для проверки, следует ли выдать значок на основе новой публикации или набора недавних публикаций, а не всех публикаций.
Условие (:backfill OR p.id IN (:post_ids)) в предложении WHERE SQL-запроса гарантирует следующее:
Если :backfill равен true, условие всегда будет истинным, и будут учтены все публикации (поскольку true OR что угодно всегда истинно).
Если :backfill равен false, будут учтены только публикации с ID из списка :post_ids (поскольку false OR p.id IN (:post_ids) истинно только для тех публикаций, чьи ID входят в этот список).
Это позволяет Discourse эффективно выдавать значки либо на основе всех исторических публикаций, либо на основе небольшого набора недавних публикаций в зависимости от ситуации.
Думаю, мне нужно разобраться, к каким именно запросам на бейджи это действительно нужно добавлять. Мне кажется, что если вы используете «Обновлять ежедневно», то это не обязательно: