@belyaevcyrill

Как правильно в 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, но и с чем-либо другим.
  • Вопрос задан
  • 110 просмотров
Пригласить эксперта
Ответы на вопрос 1
Comment
  • id
  • author_id
  • body
  • commentable_type (Article, Post, ...)
  • commentable_id
  • 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.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы