gpt4 book ai didi

ruby-on-rails - Rails 设计 : How do I (mem)cache devise's database requests for the user object?

转载 作者:行者123 更新时间:2023-12-03 12:18:42 24 4
gpt4 key购买 nike

每次我点击经过身份验证的页面时,我都会注意到设计发出一条 SQL 语句:

用户负载 (0.2ms) SELECT users .* 发件人 users哪里 ( users . id = 1) 限制 1

(顺便说一句,我正在使用 Rails 3 .. 所以 cache_money 似乎是一种解决方案,尽管进行了大量搜索,但我找不到替代品)。

我在用户模型中尝试了许多覆盖,但似乎只调用了 find_by_sql。它传递了整个 SQL 语句的字符串。像 find_by_id 或 find 这样直观的东西似乎没有被调用。我'可以'覆盖这个方法并收集用户ID并从中做一个合理的缓存系统 - 但这非常难看。

我还尝试覆盖 authentication_user ,我可以拦截一次 SQL 尝试,但随后调用 current_user 似乎再次尝试。

简而言之,我的用户对象很少更改,并且为此不断点击数据库而不是内存缓存解决方案是一种悲伤的状态。 (假设我愿意承担使用 :after_save 作为该解决方案的一部分而非全部使所述缓存无效的所有责任)

最佳答案

以下代码将根据用户的 id 和
每次修改后使缓存无效。

class User < ActiveRecord::Base

after_save :invalidate_cache
def self.serialize_from_session(key, salt)
single_key = key.is_a?(Array) ? key.first : key
user = Rails.cache.fetch("user:#{single_key}") do
User.where(:id => single_key).entries.first
end
# validate user against stored salt in the session
return user if user && user.authenticatable_salt == salt
# fallback to devise default method if user is blank or invalid
super
end

private
def invalidate_cache
Rails.cache.delete("user:#{id}")
end
end

关于ruby-on-rails - Rails 设计 : How do I (mem)cache devise's database requests for the user object?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5781593/

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