Я не хочу делать ничего слишком сложного.
Я просмотрел часть кода для этого (спасибо @tshenry за ссылку), и кажется, что это не должно быть так запутанно.
Упоминания групп сейчас срабатывают здесь (строки 78–80). Функция expand_group_mentions() — это генератор, отвечающий за выдачу пользователей, которым должны прийти уведомления об упоминании группы (с учётом таких политик, как SiteSetting.max_users_notified_per_group_mention).
Это кажется естественным местом для размещения такой логики.
В функции create_notification мы подавляем уведомления для тех, кто уже получил уведомление того же типа. Именно поэтому редактирование поста с упоминанием группы вызывает уведомление для новых участников группы — уведомление фактически генерируется для всех пользователей группы, но затем подавляется для тех, кто уже его получил.
Я предлагаю нечто подобное: обновить функцию expand_group_mentions(), чтобы она также исключала группы, у которых уже есть запись в таблице group_mentions.
Что-то вроде этого (извините за незнание синтаксиса Ruby):
def expand_group_mentions(groups, post)
return unless post.user && groups
Group.mentionable(post.user, include_public: false).where(id: groups.map(&:id)).each do |group|
next if group.user_count >= SiteSetting.max_users_notified_per_group_mention
# Добавить проверку на группы, которые уже были упомянуты
next if GroupMentions.where(group_id: group.id, post_id: post.id).length > 0
yield group, group.users
end
end
Однако это не решает проблему предупреждения JIT.
Пытаюсь помочь решить эту задачу, дайте знать, если я просто надоедаю… ![]()