gpt4 book ai didi

ruby-on-rails - rails : Keeping count of users unread notifications

转载 作者:行者123 更新时间:2023-12-04 01:35:18 25 4
gpt4 key购买 nike

我目前有一个处理用户事件通知系统的事件模型。事件观察者在发生某些操作(例如创建新文章)时创建一个新事件。现在我想记录下当前用户没有看到的这些事件通知中有多少(类似于 facebook 上的通知 gem )。每次用户点击他们的通知链接时,数字应该重置为 0,每个创建的通知都应该将计数增加 1。我应该在哪里为每个用户存储这些数据?使用 session 会起作用还是其他更好的方法?

最佳答案

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

方法一:标准化

听起来您在这里使用了三个模型:事件、通知(“user_activities”)和用户。如果我的假设有误,请纠正我:

  • 事件属于 :user 和 has_many :notifications(一个用户执行一个事件,多个用户收到该事件的通知)
  • 通知belongs_to :activity 和belongs_to :user 并具有“读取”属性/标志
  • 用户 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 中调用 notify_users 可能更有意义而不是直接在模型上使用 after_create :
    class ActivityObserver < ActiveRecord::Observer
    def after_create(activity)
    activity.users_to_notify.each &:notify
    end
    end

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

    关于ruby-on-rails - rails : Keeping count of users unread notifications,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12880066/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com