Реакции иногда не отображаются, если отсутствует счетчик лайков

@JammyDodger заметил, что на мобильном устройстве он не может увидеть реакции под этим сообщением: ToS and Privacy buttons disappear from /about when I remove my custom FAQ URL - #3 by Canapin [example1]

Jammy (мобильное) — реакции отсутствуют:

Jammy (десктоп) — реакции слева, но отсутствуют справа:

Все остальные — видно, что он отреагировал, всё работает как ожидается:

После поиска в своей истории реакций я нашёл пример, где проблема проявляется у меня: Admins may not realize certain sidebar customization are global - #8 by JammyDodger [example2]

Общие черты обоих сообщений: реакции есть, но количество лайков, по-видимому, недоступно, так как счётчик отсутствует в actions_summary.

В зависимости от того, реагировали ли вы сами на сообщение или нет, id: 2 либо отсутствует в actions_summary, либо, если вы не реагировали, видно, что счётчик отсутствует. Если я правильно понимаю, id: 2 включается, если либо вы можете реагировать (can_act), либо count > 0.

Более внимательно посмотрев на JSON сообщения example2 https://meta.discourse.org/posts/1404583.json, где отреагировали два пользователя, обнаруживается, что этот счётчик отсутствует:

Пользователь, который не реагировал
can_act true
Пользователь, который реагировал
нет id 2

В данном случае count: 2 отсутствует для обоих пользователей. Для пользователя, который уже отреагировал, это приводит к полному отсутствию id: 2. Это, похоже, объясняет, почему реакции не отображаются для пользователя, который отреагировал, хотя реакции существуют.

Для сравнения, вот сообщение с двумя реакциями, где счётчик отображается как обычно: Buttons to order items in emoji list settings is difficult to find on touch devices - #2 by zogstrip, а также JSON сообщения: https://meta.discourse.org/posts/1907506.json

Пользователь, который не реагировал
can_act true
Пользователь, который реагировал
acted true

В этом сообщении счётчик доступен, и реакции отображаются как обычно.

Я не знаю, сколько сообщений на Meta затронуто этой проблемой, и затронуты ли другие форумы. Также я не могу предоставить шаги, объясняющие, почему данные отсутствуют. Я могу лишь сообщить, что для некоторых сообщений реакции не отображаются на мобильных телефонах и частично отображаются на ноутбуках, и причина этого, похоже, связана с отсутствием данных.

5 лайков

Начали расследование, вот черновик исправления

1 лайк

Вам удалось выяснить, как это произошло? Я нашел только примеры за 2023 год и начало 2024 года. Поэтому я задумался, отличается ли что-то в данных до того, как все реакции стали считаться лайками, от данных после этого изменения.
Так что я попробовал проверить, что произойдет, если использовать реакцию, которая не учитывается как лайк, но тогда “can_act” всё равно остаётся true, даже если “can_undo” для current_user_reaction равно false.

Это связано с тем, что параметр discourse_reactions_like_sync_enabled установлен в значение false. Такое решение было принято намеренно при миграции в мае 2024 года, чтобы не нарушить существующие данные.

Когда этот параметр отключён, синхронизатор ReactionLikeSynchronizer не запускается. Этот синхронизатор отвечает за:

  • Создание записей PostAction (лайки) для реакций
  • Обновление posts.like_count с учётом реакций

При отсутствии работы синхронизации:

  1. Реакции существуют в таблице discourse_reactions_reaction_users
  2. Но соответствующие записи PostAction отсутствуют
  3. А значение posts.like_count остаётся равным 0

Ваша догадка о временных рамках абсолютно верна — у постов 2023/начала 2024 года реакции были добавлены в период, когда синхронизация не работала, поэтому их like_count никогда не обновлялся. Старая логика сериализатора затем полностью исключала действие «лайк», если одновременно выполнялись условия count = 0 И can_act = false (окно отмены действия истекло).

Предлагаемое исправление не устраняет расхождение в самих данных — оно лишь обеспечивает корректное отображение реакций в интерфейсе, даже если данные PostAction/like_count не синхронизированы. На сайтах, где discourse_reactions_like_sync_enabled = false, наличие реакций независимо от записей PostAction является ожидаемым поведением.

1 лайк

Эта тема была автоматически закрыта через 20 часов. Новые ответы больше не принимаются.