Есть такой 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