AdilA
@AdilA
Нравится кодить, изучаю go c echo

Как сделать систему уведомления для пользователей?

В общем нужно сделать систему уведомлений для пользователей, уведомления показываются прямо на сайте, в headere на любой странице, типа вам добавили комментарий новый отзыв и так далее. Никак не могу понять как это реализовать... Сделать новую модель Notifications в ней прописать belongs_to user User has_many notifications
а как базу сархитектурить? notification_type notification_id я в тупике! Наставьте на путь истинный? Гугл не помогает!
  • Вопрос задан
  • 2795 просмотров
Решения вопроса 1
FanKiLL
@FanKiLL
Есть такой gem - https://github.com/pokonski/public_activity
У railscasts есть скринкаст как сделать это с нуля - railscasts.com/episodes/407-activity-feed-from-scratch но там показываются нотификации для всего и всех.

Я же сделал так:
миграция
class CreateActivities < ActiveRecord::Migration
  def change
    create_table :activities do |t|

      t.integer :user_id # кому нотификация
      t.integer :author_id # кто сделал действие
      t.string :action # какое действие например create значит что то создалось
      t.integer :trackable_id #полиморфизм
      t.string :trackable_type #полиморфизм
      t.boolean :read, default: false
      t.timestamps
    end

    add_index :activities, [:trackable_id, :trackable_type]
    add_index :activities, :user_id
    add_index :activities, :author_id
    add_index :activities, :read
  end
end


потом в applicationController.rb есть такой метод
def create_activity(to, author, action, trackable)
    activity = to.activities.build
    activity.author = author
    activity.action = action
    activity.trackable = trackable #полиморфизм обьект над которым произвелось действие
    activity.save
  end


и потом в любом контролере
например юзер отсылает сообщение другому юзеру или кто то оставляет комментарий вообщем любое действие
create_activity(@user, current_user, 'create', @post)


в итоге у вас потом такая лента примерно toster.ru/my/tracker как у тостера
если взять все уведомления у юзера
@activities = current_user.activities.includes(:author, :trackable).order(created_at: :desc)


в view у вас всё есть, кому нотификация, действие которое было сделанно и обьект на который вы можете дать ссылку
например вот так, но это частный случай у вас конечно будет подругому
<%= link_to activity.author.username, user_path(activity.author) %> ответил на сообщение <%= link_to activity.trackable.conversation.title, my_conversation_path(activity.trackable.conversation) %>


Будет написанно например
FanKiLL ответил на сообщение название сообщения
или
FanKiLL написал новый пост

Вообщем предлогаю посмотреть gem и скринкаст что я дал вначале - а там и этот код будет более понятен - если что спрашивайте.

когда юзер заходит на страницу с нотификациями все не прочитанные сообщения помечаются как прочитанные а до этого можете где хотите выводить список не прочитанных сообщений

current_user.activities.where(read: false).count
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы