2009-06-26 7 views
1

私のwebappはユーザーを登録しており、記事、ブログ記事、ゴシップもあります。 これらのリソースのすべてについて、私は以下にリストされている多態性コメントモデルを持っています。railsのユーザーへのコメントはどうですか?

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を格納することができ通知のようないくつかのモデルを持っていると思います(マッチングのcommentableとユーザーと作成された新しいコメントがあった場合に通知が送られるべきである誰に?

どのようにすることができますコメントと通知の関連付けを実装していますか?特定のコメント可能なリソースを購読している人がいるかどうかを調べるには、after_createフックを使用してCommentObserverを作成して検索を初期化し、一致するレコードがあれば通知を送信します。

私は、これを達成するために協会、モデル、コントローラ、およびビューがどのように見えるのか混乱していますか?彼はコメントモデルはすでに多型ですが、多型としても通知モデルを作成できますか?

答えて

6

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

1

最初のステップは、これが完了すると通知

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

    $ rake db:migrate 
    $ rails g controller Notifications index 

ための新しいモデルとコントローラを作成され、次のステップはにhas_manyを追加です:ユーザーへの通知、ポスト、およびコメントモデル。

これが完了すると、コメントモデルに次のコードを追加します

 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 

最後にすべきことは、いくつかのビューを作成することです。あなたは今までに何ができますか

関連する問題