ruby-on-rails – 通知ala Facebook(数据库实施)
我想知道Facebook如何实现他们的通知系统,因为我正在寻找类似的东西.
> FooBar评论了你的状态 我不能将多个通知写入单个记录,因为最终我将有与每个通知相关联的操作.此外,在视图中,我希望当单个主题存在一定数量的通知时,通知将呈现为可扩展列表. > FooBar评论了你的状态(行动) > MegaMan评论了您的活动(行动) 干杯! 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将是“喜欢”的东西.您甚至可能有多个人通知,例如当有人对其进行评论时通知照片中标记的所有人. 希望这可以帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |