web-dev-qa-db-ja.com

レールで通知システムを作成する方法は?

基本的に、FacebookやStackoverflowのような通知を作成します。具体的には、投稿コメントシステムでは、投稿にコメントが付けられると、関係するすべてのユーザー(投稿を作成し、コメントを作成した人。ただし、新しいコメント投稿者を除く)は、この投稿にコメントが付けられたことを示す通知メッセージを受け取ります。そして、人々がそれを読んだとき、通知は却下されます。

私はmailboxer gemを使用して実装しようとしましたが、残念ながらsocial_stream自体を含む、関連するメソッドを使用して使用できる例はありません。

通知システムを作成する他の方法はありますか?

そして、最初から作成しようとすると、いくつかの問題が発生します。

    Model Notification
    topic_id: integer
    user_id: integer
    checked: boolean #so we can tell whether the notification is read or not
  1. ユーザーが読んだ後に通知を閉じる

ユーザーが通知のインデックスにアクセスした後、すべての通知メッセージの "checked"属性をtrueにする必要があるだけだと思います。(NotificationsController内)

    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つの問題に答える必要はありません。通知システムの簡単な解決策が望ましいです。

27
cqcn1991

私はあなたが正しい道にいると思います。

少し良い通知#インデックス

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 }
    

@コメントの投稿コメントに参加したユニークユーザーは、current_userを拒否(結果から削除)します。

  1. JoãoDanielが指摘したオブザーバーは、after_createよりも優先されます。この「Railsのベストプラクティス」は、それをかなりうまく説明しています: http://Rails-bestpractices.com/posts/2010/07/24/use-observer
13
Leonel Galán

パブリックアクティビティと呼ばれるすばらしい宝石があります。好きなようにカスタマイズできます。railscastでスクリーンキャストをご覧ください http://railscasts.com/episodes/406-public-activity あなたを助けることができます。

更新

私のRailsアプリケーションで、私はあなたのような同様の通知システムを作成して、すべてのユーザーに通知を送信しましたが、インデックスアクションではユーザーが使用できます

current_user.notifications.update_all(:checked=>true)

また、誰かが投稿にコメントしたことをユーザーに1回だけ通知するために、unique_byメソッドを使用できます。

  @comments [email protected]_by {|a| a[:user_id]}

その後、以前のコメントのユーザーにのみ通知を送信できます

 @comments.each do |comment|
 comment.user.notifications.create!(....
 end 

お役に立てば幸いです

9
Remon Amin