为线程评论系统设置通知系统的正确方法

时间:2013-09-01 22:20:38

标签: ruby-on-rails ruby ruby-on-rails-3 algorithm

我为自己的应用构建了自定义评论系统。用户来自哪里并添加评论,然后其他人可以回复评论。此处仅使用字段bodycreated_atupdated_atuserparent_id创建一个表格。话虽这么说,如果一行有parent_id表示其子评论,如果没有,那么它是父评论。

现在我正在尝试设置一个基本的通知系统/区域,用户可以在其中跟踪新的评论。我希望设置一些用户可以看到他们收到的未读评论的内容,无论其是否有儿童评论的父评论。类似于github的东西。

那么,我该怎么做呢?最初我想在Comment表中添加一个字段,说read。这将是一个布尔值,取决于它是否真实,将显示通知。但问题是,我希望所有用户都能在线程中通知(所有父级和子级注释)有关此新注释的信息。

现在,我可以采取哪些其他方法来解决这个问题?

希望我没有迷惑你。

1 个答案:

答案 0 :(得分:2)

我的一些评论:

  1. 判断评论是否被阅读是很困难和没有必要的。请参阅此处,如果我在此处发表评论,您在转到此页面时会看到更新,但您仍会在左上角收到通知。

  2. JS可以判断是否读取通知,或者通过手动标记读取更简单的判断。

  3. 那么,你不需要一个is_read?评论中的字段。每条评论都未读。

  4. 首先在Comment中设置正确的关联。

    假设您没有更复杂且需要HABTM关联的嵌套线程。

    class Comment < ActiveRecord::Base
      has_many :children, class_name: 'Comment'
      belongs_to :parent, class_name: 'Comment', foreign_key: 'parent_id'
    
      def related_comments
        parent.children - [self] if parent_id?
      end
    end
    

    然后使用回调/观察者来处理

    回调是为了简单起见,Observer是首选,因为这涉及另一个Class。

      after_save :send_unread_notification, if: :parent_id?
    
      private
      # or better to send it to a backend job if necessary
      def send_unread_notification
        related_comments.each do |c|
          notification = Notification.new{
                           notifier: c.user,
                           message: 'You have unread comment',
                           sender:  'comment',
                           sender_id: c.id }
          notification.save!
        end
      end
    

    然后创建通知类和UI

    简单易懂。