运维开发网

ruby-on-rails – 通知ala Facebook(数据库实施)

运维开发网 https://www.qedev.com 2020-06-09 16:51 出处:网络 作者:运维开发网整理
我想知道Facebook如何实现他们的通知系统,因为我正在寻找类似的东西. > FooBar评论了你的状态 > Red1,Green2和Blue3对你的照片发表了评论 > MegaMan和另外5人对您的活动发表了评论 我不能将多个通知写入单个记录,因为最终我将有与每个通知相关联的操作.此外,在视图中,我希望当单个主题存在一定数量的通知时,通知将呈现为可扩展列表. > FooBar评论了你的状态(行
我想知道Facebook如何实现他们的通知系统,因为我正在寻找类似的东西.

> FooBar评论了你的状态

> Red1,Green2和Blue3对你的照片发表了评论

> MegaMan和另外5人对您的活动发表了评论

我不能将多个通知写入单个记录,因为最终我将有与每个通知相关联的操作.此外,在视图中,我希望当单个主题存在一定数量的通知时,通知将呈现为可扩展列表.

> FooBar评论了你的状态(行动)

> Red1,Green2和Pink5对你的照片[]发表了评论

> MegaMan和另外3人对您的活动发表了评论[ – ]

> MegaMan评论了您的活动(行动)

> ProtoMan评论了你的活动(行动)

> Bass评论了你的活动(行动)

> DrWilly评论了您的活动(行动)

干杯!

PS我正在使用postgres和rails BTW.

有很多方法可以实现这一点.这实际上取决于您想要涵盖哪些类型的通知以及您需要收集哪些有关通知的信息,以便将其显示给正确的用户.如果您正在寻找一个简单的设计,只包含有关已发布评论的通知,您可以使用 polymorphic associations和 observer callbacks的组合:

class Photo < ActiveRecord::Base
# or Status or Event
    has_many :comments, :as => :commentable
end

class Comment < ActiveRecord::Base
    belongs_to :commenter
    belongs_to :commentable, :polymorphic => true # the photo, status or event
end

class CommentNotification < ActiveRecord::Base
    belongs_to :comment
    belongs_to :target_user
end

class CommentObserver < ActiveRecord::Observer
    observe :comment

    def after_create(comment)
        ...
        CommentNotification.create!(comment_id: comment.id,
          target_user_id: comment.commentable.owner.id)
        ...
    end
end

这里发生的事情是每张照片,状态,事件等都有很多评论.注释显然属于:commenter,但也属于:commentable,可以是照片,状态,事件或任何其他您想要允许注释的模型.然后,您有一个CommentObserver,它将观察您的Comment模型,并在Comment表中发生某些事情时执行某些操作.在这种情况下,在创建Comment之后,观察者将创建一个CommentNotification,其中包含注释的id和拥有该注释所关注事物的用户的id(comment.commentable.owner.id).这将要求您实现一个简单的方法:您想要为其注释的每个模型的所有者.因此,例如,如果可评论是照片,则所有者将是发布照片的用户.

这个基本设计应该足以让您入门,但请注意,如果您要为注释之外的其他内容创建通知,则可以通过在更通用的Notification模型中使用多态关联来扩展此设计.

class Notification < ActiveRecord::Base
    belongs_to :notifiable, :polymorphic => true
    belongs_to :target_user
end

通过这种设计,您可以“观察”所有通知(要为其创建通知的模型),并在after_create回调中执行以下操作:

class GenericObserver < ActiveRecord::Observer
    observe :comment, :like, :wall_post

    def after_create(notifiable)
        ...
        Notification.create!(notifiable_id: notifiable.id, 
                           notifiable_type: notifiable.class.name,
                            target_user_id: notifiable.user_to_notify.id)
        ...
    end
end

这里唯一棘手的部分是user_to_notify方法.所有需要通知的模型都必须以某种方式实现它,具体取决于模型的内容.例如,wall_post.user_to_notify只是墙的所有者,或者like.user_to_notify将是“喜欢”的东西.您甚至可能有多个人通知,例如当有人对其进行评论时通知照片中标记的所有人.

希望这可以帮助.

0

精彩评论

暂无评论...
验证码 换一张
取 消