1

我已经为我的应用程序构建了一个自定义评论系统。用户进来并添加评论,然后其他人可以回复评论。在这里只创建了一个包含字段body, created_at, updated_at,user的表parent_id。话虽这么说,如果一行有一个parent_id,这意味着它是一个子评论,如果没有,那么它就是一个父评论。

现在我正在尝试设置一个基本的通知系统/区域,用户可以在其中跟踪新评论。我正在寻找设置一些东西,用户可以看到他们收到的未读评论,无论它是否是子评论的父评论。类似于 github 的做法。

那么,我该怎么做呢?最初我想在Comment表格中再添加一个字段,说read。这将是一个布尔值,取决于它是否为真,通知是否会显示。但这里的问题是,我希望在线程(所有父子评论)中通知所有用户这个新评论。

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

希望我没有混淆你。

4

1 回答 1

2

我的一些评论:

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

  2. 通知可以通过JS判断是否已读,也可以通过手动标记为已读,更简单。

  3. 那么,您不需要 is_read 吗?评论中的字段。每条评论都是未读的。

首先在评论中设置正确的关联。

假设您没有更复杂且需要 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

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

回调是为了简单起见,首选观察者,因为这涉及另一个类。

  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

为简单起见省略。

于 2013-09-02T00:45:53.180 回答