每次我点击经过身份验证的页面时,我都会注意到设计发出一条 SQL 语句:
用户负载(0.2ms)选择users
.* FROM users
WHERE (users
.id
= 1) 限制 1
(顺便说一句,我正在使用Rails 3..所以cache_money似乎是一个解决方案,尽管进行了大量搜索,但我没有找到替代品)。
我在用户模型中尝试了许多重写,但似乎只调用了 find_by_sql 。其中传递了整个 SQL 语句的字符串。像 find_by_id 或 find 这样直观的东西似乎没有被调用。我“可以”覆盖这个方法并收集用户 ID 并从中创建一个合理的缓存系统 - 但这非常丑陋。
我还尝试覆盖authenticate_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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)