Как создать систему уведомлений в рельсах?
В принципе, я хочу создать уведомление как Facebook и Stackoverflow.
В частности, в системе Post-Comments, когда сообщение прокомментировано, все участники (люди, которые создают сообщение и создают комментарии, кроме нового комментатора) получают сообщение с уведомлением о том, что это сообщение комментируется.
И уведомление увольняется, когда люди его прочитали.
Я попытался использовать почтовый ящик для его реализации, но, к сожалению, нет доступных примеров с использованием связанных методов, включая social_stream.
Есть ли другой способ создания системы уведомлений?
И когда я пытаюсь создать его с нуля, у меня возникает несколько проблем:
Model Notification
topic_id: integer
user_id: integer
checked: boolean #so we can tell whether the notification is read or not
- Отклонение уведомления после чтения пользователями
Я думаю, нам просто нужно включить атрибут "checked" уведомлений "true" после того, как пользователь посетит индекс уведомления. (В NotificationController)
def index
@notifications=current_user.notication.all
@notification.each do |notification|
notification.checked = true
end
@notification.save!
end
2.Выберите пользователей для уведомления (и исключите пользователя, делающего новый комментарий)
Я просто понятия не имею о том, что вы делаете запросы...
3.Создание уведомлений
Я думаю, что это должно быть что-то вроде
#in CommentController
def create
#after creating comments, creat notifications
@users.each do |user|
Notification.create(topic_id:@topic, user_id: user.id)
end
end
Но я думаю, что это действительно уродливо
Нет необходимости отвечать на 3 проблемы выше. Любое простое решение для системы уведомлений предпочтительнее, спасибо....
Ответы
Ответ 1
Я думаю, что ты на правильном пути.
Несколько лучше уведомлений # index
def index
@notifications = current_user.notications
@notifications.update_all checked: true
end
-
Сообщите об этом пользователям
User.uniq.joins(:comments).where(comments: {id: @comment.post.comment_ids}).reject {|user| user == current_user }
Уникальные пользователи, участвовавшие в комментариях к сообщению @comment, отклоняют (удаляют из результата) current_user.
- Наблюдатель, как указал Жоау Даниэль, предпочтительнее, чем after_create. Эта "лучшая практика Rails" описывает ее довольно хорошо: http://rails-bestpractices.com/posts/2010/07/24/use-observer
Ответ 2
есть удивительный камень, называемый общественной деятельностью, вы можете настроить его так, как хотите
и вот скринкаст об этом в railscast http://railscasts.com/episodes/406-public-activity
надеюсь, что это может вам помочь.
Update
В моем приложении rails я сделал аналогичную систему уведомлений, такую как ваша, для отправки уведомлений всем пользователям
но в действии индекса вы можете использовать
current_user.notifications.update_all(:checked=>true)
а также отправлять только одно уведомление пользователю несколько раз, когда кто-то прокомментировал сообщение, вы можете использовать метод unique_by
@comments [email protected]_by {|a| a[:user_id]}
тогда вы можете отправлять уведомления только пользователям предыдущих комментариев
@comments.each do |comment|
comment.user.notifications.create!(....
end
надеюсь, что это поможет вам