gpt4 book ai didi

ruby-on-rails - 作用域关联上的 Rails 中的 counter_cache

转载 作者:行者123 更新时间:2023-12-03 06:59:08 26 4
gpt4 key购买 nike

我有 User型号has_many :notifications . Notification有一个 bool 列 seen和一个名为 :unseen 的范围返回所有通知,其中 seenfalse .

class User < ApplicationRecord
has_many :notifications
has_many :unseen_notifications, -> { unseen }, class_name: "Notification"
end

我知道如果我添加一个名为 notifications_count 的列,我可以缓存通知的数量。至 users并添加 counter_cache: true到我的 belongs_to调用 Notification .

但是,如果我想缓存用户拥有的未见通知的数量怎么办? IE。缓存 unseen_notifications.size而不是 notifications.size ?是否有内置方法可以使用 counter_cache 执行此操作还是我必须推出自己的解决方案?

最佳答案

根据 this blog post ,没有内置的方法可以将计数器缓存用于范围关联:

ActiveRecord’s counter cache callbacks only fire when creating or destroying records, so adding a counter cache on a scoped association won’t work. For advanced cases, like only counting the number of published responses, check out the counter_culture gem.



除了使用外部 gem 之外,您还可以通过向您的 Notification 添加回调来推出您自己的解决方案。模型并将整数列(例如, unseen_notifications_count )添加到 User模型:

# Notification.rb
after_save :update_counter_cache
after_destroy :update_counter_cache

def update_counter_cache
self.user.unseen_notifications_count = self.user.unseen_notifications.size
self.user.save
end

另请参阅 Counter Cache for a column with conditions? 的答案有关此方法的其他实现示例。

关于ruby-on-rails - 作用域关联上的 Rails 中的 counter_cache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37029847/

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