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

标签 ruby-on-rails devise

每次我点击经过身份验证的页面时,我都会注意到设计发出一条 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/

相关文章:

ruby-on-rails - rails : form_for routes won't display a good form

ruby-on-rails - 帮助解释这段 Rails 代码

ruby-on-rails - Rails没有路线匹配{:controller= >“devise/products” }

ruby-on-rails - Rails 的动态查找器中的第二个参数是什么?

ruby-on-rails - 在 gemfile 中指向 gem 分支路径

ruby-on-rails - 客户端 MVC 而不是服务器端 MVC

ruby-on-rails - 如何在 Devise 中覆盖 valid_password?(password)

ruby-on-rails - 如何调用完全限定的 Devise sign_in 方法?

ruby-on-rails - Rails_admin : Should I have admin_user or user with admin role to manage users and admin panel

ruby-on-rails - 设计和谷歌oauth。 (ror3)