gpt4 book ai didi

ruby-on-rails - Rails 计数器缓存

转载 作者:数据小太阳 更新时间:2023-10-29 08:04:46 25 4
gpt4 key购买 nike

我有一个带有多个计数器缓存的数据库模式。我不想让计数器缓存分布在许多表中,而是希望有一个名为 user_counters 的表,其中包含所有各种计数器缓存。我会使用如下方法从服务对象更新这些缓存:

def update_user_counter(column, user_id)
UserCounter.increment_counter(column, user_id)
end

但是,关联用户的 UserCounter 记录很可能与用户的 ID 不同。我想做的是这样的:

def update_user_counter(column, user_id)    
UserCounter.increment_counter(column, UserCounter.where('user_id = "#{user_id}"')
end

关于如何实现这一点有什么想法吗?谢谢!!

最佳答案

如果这些是 10 个与用户关联的属性,是否有任何理由不简单地将它们作为用户模型的一部分?如果是这种情况,下面的代码仍然有效(只需将方法作为 User 而不是 UserCounter 的一部分)。

如果您想按照自己的方式实现它,我会说首先确保您的 user_counters 表在 user_id 上有一个索引(因为 Rails 不擅长添加索引和 FK)。

然后,您可以这样做(将“列”作为符号传递):

class UserCounter < ActiveRecord::Base
#other code

def self.update_user_counter(column, user_id)
counter = UserCounter.find_by_user_id(user_id)
counter.update_attribute(column, counter.read_attribute(column) + 1)
counter.save!
end
end

在您的其他模型中:

class SomeOtherModel < ActiveRecord::Base
#Model code

def update_counter(user)
UserCounter.update_user_counter(:this_column, user.id)
end
end

此解决方案(或使用 update_counter 方法)都需要两次数据库命中,一次用于查找,一次用于更新。如果您需要速度,可以直接用 SQL 编写:

query = "UPDATE user_counters SET #{column} = #{column} + 1 WHERE user_id = #{user_id};"
ActiveRecord::Base.connection.execute(query);

这假设 user_iduser_counters 上是唯一的。

关于ruby-on-rails - Rails 计数器缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16431996/

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