Rails:保持用户未读通知的数量

时间:2012-10-14 07:08:43

标签: ruby-on-rails ruby-on-rails-3

我目前有一个处理用户活动通知系统的活动模型。当某些操作发生时(例如正在创建新文章),活动观察者会创建一个新活动。现在我想记录当前用户没有看到过多少这些活动通知(类似于facebook上的通知宝石)。每次用户点击他们的通知链接时,该号码应重置为0,并且每个创建的通知都应将计数增加1.我将为每个用户存储此数据的位置?使用会话还是其他更好的东西?

2 个答案:

答案 0 :(得分:19)

有几种可能的方法:规范化和非规范化。我将从规范化开始:

方法1:归一化

听起来你在这里有三个模型:活动,通知(“user_activities”)和用户。如果我的假设错了,请纠正我:

  • 活动belongs_to:user和has_many:通知(一个用户执行活动,多个用户收到活动通知)
  • 通知belongs_to:activity和belongs_to:user并具有“read”属性/ flag
  • 用户has_many:通知

在活动的after_create回调中,模型应确定哪些用户需要该活动的通知,然后通过为每个活动创建通知对象来通知他们。

在通知上,您可以创建一个名为unread的类方法,该方法指定活动的读取标志为false的条件:

def self.unread
  where(:read => false)
end

然后,要访问用户的未读通知计数,只需致电:

user.notifications.unread.count

当用户查看其通知时,请致电:

user.notifications.unread.update_all(:read => true)

方法2:非规范化

在这种方法中,无论何时创建活动,它都应手动为每个通知用户递增计数器。您可以使用以下任一方式完成此操作:

  • 用户
  • 上的“unseen_count”属性
  • 非关系型数据库中的键值对(例如redis)

活动:

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

在用户中:

def notify
  update_attributes(:unseen_count => unseen_count + 1)
end

def see_activities
  update_attributes(:unseen_count => 0)
end

此方法的缺点是您已消除了通知模型,因此用户只有通知的原始计数,并且无法查看通知及其相关活动的详细列表。您可以使用混合方法,但请记住,处理看不见的通知计数的两个事实来源是有风险的。

旁注:在模型中直接调用observer而不是after_create中的notify_users可能更有意义:

class ActivityObserver < ActiveRecord::Observer
  def after_create(activity)
    activity.users_to_notify.each &:notify
  end
end

如果使用观察者,则可以删除Activity#notify_users和Activity#after_create。

答案 1 :(得分:6)

请看看这个宝石:
https://github.com/ledermann/unread

它由我编写,以更高效的方式处理任何ActiveRecord对象的读/未读状态。