Mat*_*Hui 11 ruby-on-rails ruby-on-rails-3
我目前有一个处理用户活动通知系统的活动模型.当某些操作发生时(例如正在创建新文章),活动观察者会创建一个新活动.现在我想记录当前用户没有看到过多少这些活动通知(类似于facebook上的通知宝石).每次用户点击他们的通知链接时,该号码应重置为0,并且每个创建的通知都应将计数增加1.我将为每个用户存储此数据的位置?会使用会话还是其他更好的东西?
Bre*_*son 19
有几种可能的方法:规范化和非规范化.我将从规范化开始:
听起来你在这里有三个模型:活动,通知("user_activities")和用户.如果我的假设在这里错了,请纠正我:
在活动的after_create回调中,模型应确定哪些用户需要该活动的通知,然后通过为每个活动创建通知对象来通知他们.
在通知上,您可以创建一个名为unread的类方法,该方法指定活动的读取标志为false的条件:
def self.unread
where(:read => false)
end
Run Code Online (Sandbox Code Playgroud)
然后,要访问用户的未读通知计数,只需调用:
user.notifications.unread.count
Run Code Online (Sandbox Code Playgroud)
当用户查看其通知时,请致电:
user.notifications.unread.update_all(:read => true)
Run Code Online (Sandbox Code Playgroud)
在此方法中,无论何时创建活动,它都应手动为每个通知的用户递增计数器.你可以用以下任何一个来完成
在活动中:
def users_to_notify
# Find a list of users to notify
end
def notify_users(users)
users.each &:notify
end
def after_create
notify_users(users_to_notify)
end
Run Code Online (Sandbox Code Playgroud)
在用户中:
def notify
update_attributes(:unseen_count => unseen_count + 1)
end
def see_activities
update_attributes(:unseen_count => 0)
end
Run Code Online (Sandbox Code Playgroud)
这种方法的缺点是您已经消除了通知模型,因此用户只有通知的原始计数,并且无法查看通知及其相关活动的详细列表.您可以使用混合方法,但请记住,处理看不见的通知计数的两个事实来源是有风险的.
另外注意:在观察者中调用notify_users 而不是直接在模型上调用after_create 可能更有意义:
class ActivityObserver < ActiveRecord::Observer
def after_create(activity)
activity.users_to_notify.each &:notify
end
end
Run Code Online (Sandbox Code Playgroud)
如果使用观察者,则可以删除Activity#notify_users和Activity#after_create.
| 归档时间: |
|
| 查看次数: |
5263 次 |
| 最近记录: |