27

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

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

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

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

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

ユーザーが通知のインデックスにアクセスした後、すべての通知メッセージの「チェック済み」属性を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つの問題に答える必要はありません。通知システムの簡単な解決策が望ましいです、ありがとう...。

4

2 に答える 2

13

私はあなたが正しい道を進んでいると思います。

少し良いnotifications#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. JoãoDanielが指摘したオブザーバーは、after_createよりも優先されます。この「Railsのベストプラクティス」は、それを非常によく説明しています:http: //rails-bestpractices.com/posts/2010/07/24/use-observer
于 2013-03-13T14:16:47.613 に答える
9

パブリックアクティビティと呼ばれる素晴らしい宝石があります。必要に応じてカスタマイズできます。これは、railscasthttp://railscasts.com/episodes/406-public-activityでのスクリーンキャストです

アップデート

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

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

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

  @comments =@commentable.comments.uniq_by {|a| a[:user_id]}

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

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

それがあなたを助けることができることを願っています

于 2013-03-13T15:29:09.077 に答える