作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
每次我点击经过身份验证的页面时,我都会注意到设计发出一条 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/
我是一名优秀的程序员,十分优秀!