Подтвердить что ты не робот

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

В принципе, я хочу создать уведомление как 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 проблемы выше. Любое простое решение для системы уведомлений предпочтительнее, спасибо....

4b9b3361

Ответ 1

Я думаю, что ты на правильном пути.

Несколько лучше уведомлений # index

def index
  @notifications = current_user.notications
  @notifications.update_all checked: true
end
  1. Сообщите об этом пользователям

    User.uniq.joins(:comments).where(comments: {id: @comment.post.comment_ids}).reject {|user| user == current_user }
    

Уникальные пользователи, участвовавшие в комментариях к сообщению @comment, отклоняют (удаляют из результата) current_user.

  1. Наблюдатель, как указал Жоау Даниэль, предпочтительнее, чем 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 

надеюсь, что это поможет вам