优化Devise查询基于remember_token查找用户

时间:2014-09-05 12:59:36

标签: ruby-on-rails ruby ruby-on-rails-3 devise

我正在使用Devise-1.5.4和Rails 3.0.20。

Devise提供current_userauthenticate_user!等方法,调用authenticate!,它本身调用serialize_from_cookie,使用remember_token对用户进行身份验证。

此外,serialize_from_cookie方法接收id作为参数,以便查询主键上的Users表(自动为优化查询)。

但是,我在MySQL日志中看到select * from users where remember_token = 'XXXXXX'等查询。

由于users表变得越来越大,这些查询变得越来越慢。我有以下问题:

  1. 我无法调试Devise进行此类查询的位置(代码中)?
  2. 如何优化这些查询(除了添加索引)?

1 个答案:

答案 0 :(得分:1)

Devise进行查询以确保在设置新的remember_token时尚未设置相同的令牌。

https://github.com/heartcombo/devise/blob/master/lib/devise/models/rememberable.rb#L146

# Generate a token checking if one does not already exist in the database.
def remember_token #:nodoc:
  loop do
    token = Devise.friendly_token
    break token unless to_adapter.find_first({ remember_token: token })
  end
end