1

私の webapp にはユーザーが登録されており、記事、ブログ投稿、ゴシップも含まれています。これらすべてのリソースに対して、以下にリストされているポリモーフィックなコメント モデルがあります。

id  content         commentable_id  commentable_type   user_id  created_at  updated_at
1   Frist comment   2               Article            1        ....
2   Second comment  3               Post               2        .....

そのため、コメント可能なリソースごとに、コメント可能なリソースの下部に、ユーザーがコメントできるコメント フォームを用意しました。コメントの送信中にチェックボックスをオンにすると、ユーザーは、後で他の新しいコメントが追加されたときに、ユーザーのサインアップに既にあるため、受信トレイまたは電子メールで通知を受け取る必要があります。

commentable_type、commentable_id、および user_id を格納できる Notifications のようなモデルが必要です (commentable と user が一致する新しいコメントが作成された場合、誰に通知を送信する必要がありますか?

コメントと通知の関連付けを実装するにはどうすればよいですか? 特定のコメント可能なリソースへのサブスクライブがあるかどうかを確認する部分では、 after_create フックを使用して CommentObserver を作成し、一致するレコードがある場合に検索を初期化し、通知を送信します。

しかし、これを達成するために関連付け、モデル、コントローラー、およびビューがどのように見えるか混乱していますか? コメント モデルは既にポリモーフィックなので、通知モデルもポリモーフィックに作成できますか??

4

2 に答える 2

6

プラグインなしでこれを簡単に実現できます。投稿のユーザー通知サブスクリプションを格納するデータベーステーブルを作成します。次に、コメントを作成するたびに、データベースにクエリを実行し、ActionMailerを使用してすべてのユーザーのアドレスに電子メールを送信します。

于 2009-06-26T22:29:51.020 に答える
1

最初のステップは、通知用の新しいモデルとコントローラーを作成することです

   $ rails g model Notification  post:references comment:references user:references read:boolean

   $ rake db:migrate
   $ rails g controller Notifications index

これが完了したら、次のステップは has_many :notifications を User、Post、および Comment モデルに追加することです。

これが完了したら、次のコードを Comments モデルに追加します。

       after_create :create_notification

       private

         def create_notification
           @post = Post.find_by(self.post_id)
           @user = User.find_by(@post.user_id).id
             Notification.create(
             post_id: self.post_id,
            user_id: @user,
             comment_id: self,
             read: false
              )
        end

上記のスニペットは、コメントが作成されると通知を作成します。次の手順では、通知コントローラーを編集して、通知を削除し、ユーザーが通知を既読としてマークできるようにします。

       def index
         @notifications = current_user.notications
         @notifications.each do |notification|
         notification.update_attribute(:checked, true)
      end
     end

      def destroy
        @notification = Notification.find(params[:id])
        @notification.destroy
        redirect_to :back
      end

次に行うことは、コメントが削除されたときに通知を削除する方法を設定することです。

          def destroy
           @comment = Comment.find(params[:id])
           @notification = Notification.where(:comment_id => @comment.id)
             if @notification.nil?
               @notification.destroy
             end
           @comment.destroy
           redirect_to :back
        end

最後に、いくつかのビューを作成します。やりたいことは何でもできる

于 2014-12-16T10:38:45.417 に答える