Как правильно в RoR реализовать систему уведомлений?
Есть некоторая система на RoR, в которой присутствуют механизм комментирования статьи, лайка статьи, присвоения статуса статье, и отправка статьи на "Доску почета". Главный объект внимания - Статья.
У статьи своя модель - Article. И соответственно (has_many) модели, которые связаны с Article - это лайки (Like), комментарии (Comment).
На текущий момент все события регистрируются с помощью callbacks в Article. То есть - если статье поставлен лайк, оставлен комментарий, сменен статус или статья отправлена на доску почета, то срабатывает коллбэк after_update, который вызывает некоторый метод createNotification, находящийся в хелпер-классе.
Метод createNotification в свою очередь добавляет в общую таблицу notifications все уведомления.
Как, на ваш взгляд, было бы корректно хранить уведомления в notifications, если помимо добавления события нужен ещё и откат события? Допустим, поставлен Лайк, событие добавлено. А если этот лайк убран, то из таблицы запись об этом лайке убирается.
С Лайками тут просто. Потому что лайк убрать может только тот, кто его ставит. То есть соответствующую запись в таблице notifications найти легко.
Но как быть с комментариями, если комментарий может удалить не только создатель комментария, но и пользователи с ролью, допустим, Moderator/Admin/и т.д. ? Как его удалить из notifications, если в таблице notifications я храню только ИД статьи? Получается требуется сохранять ИД комментария тоже? Ведь связь модели Comment и Article один-ко-многим.
На текущий момент в таблице notifications я сохраняю тип уведомления (строка - лайк, коммент, статус или доска почета), ИД изменяемой сущности (в данному случае ИД статьи), ИД пользователя, который совершил действие (лайк, коммент и т.д.).
Хочется, чтобы хранение в notifications было универсально. Чтобы не только можно было сохранять уведомления, связанные с Article, но и с чем-либо другим.
is_hidden (скрывать, если модератор или автор удалил)
t.references :commentable, polymorphic: true
Like
id
author_id
likeable_type (Article, Post, Comment, ...)
likeable_id
points (+1,-1)
Удалять лайки не нужно. Собирать все +1 и -1 вместе и затем считать их сумму. Подсчёт лайков не обязан быть моментальным и точным 100%.
Когда срабатывает коллбэк after_update, не обновлять сразу, а отправлять событие в очередь. Воркер подхватит событие и обработает его. Проверять время последнего обновления и если превысило, скажем, 1 минуту (чтобы не нагружать СУБД), обновить счёт.
Таблицу уведомлений - по аналогии с comments.