我为自己的应用构建了自定义评论系统。用户来自哪里并添加评论,然后其他人可以回复评论。此处仅使用字段body
,created_at
,updated_at
,user
,parent_id
创建一个表格。话虽这么说,如果一行有parent_id
表示其子评论,如果没有,那么它是父评论。
现在我正在尝试设置一个基本的通知系统/区域,用户可以在其中跟踪新的评论。我希望设置一些用户可以看到他们收到的未读评论的内容,无论其是否有儿童评论的父评论。类似于github的东西。
那么,我该怎么做呢?最初我想在Comment
表中添加一个字段,说read
。这将是一个布尔值,取决于它是否真实,将显示通知。但问题是,我希望所有用户都能在线程中通知(所有父级和子级注释)有关此新注释的信息。
现在,我可以采取哪些其他方法来解决这个问题?
希望我没有迷惑你。答案 0 :(得分:2)
我的一些评论:
判断评论是否被阅读是很困难和没有必要的。请参阅此处,如果我在此处发表评论,您在转到此页面时会看到更新,但您仍会在左上角收到通知。
JS可以判断是否读取通知,或者通过手动标记读取更简单的判断。
那么,你不需要一个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
回调是为了简单起见,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
简单易懂。