2013-10-01 79 views
0

我已经制作了一篇文章和评论,现在我会添加一个通知系统,在每次有人发表评论时在对话中提醒每个用户。如何实施通知系统?

我的问题是哪个是建立这个系统的数据库方面最好的方法? 我认为一个通知表具有以下字段:

id_notification | sent_by | id_user_receiver | id_post 
     1    2    3    10 

在这个例子中ID为2的用户已经写信给后id为10和id为3的用户评论收到通知。但是,如果对话涉及100或1000个用户,则每次有用户在对话中写入时,我将在数据库中结束100或1000条记录。我认为不是正确的方法。什么是更好的解决方案?

回答

2

我认为这是正确的方法,如果用户阅读通知,您可以简单地删除该行,因为它将来不再需要。除此之外,1000条记录不算什么。您可以轻松地在表格中创建数百万条记录,确保您的索引是正确的。

0

第一步是创建一个新的模型和控制器的通知

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

    $ rake db:migrate 
    $ rails g controller Notifications index 

一旦这样做了,下一步就是添加has_many:通知用户,Post和Comment模型。

一旦做到这一点,下面的代码添加到评论模式:

 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 

最后要做的是创造一些看法。你可以做任何你想做的事