如何清除rails会话表

Ana*_*and 18 ruby-on-rails ruby-on-rails-3

我使用活动记录存储为rails会话存储.

在短短的时间内,sessions桌子的大小增加了很多.如何在一段时间后转储这些会话行.或者我应该在24小时内手动清除它们一次?

sca*_*er2 33

在Rails 3.2中使用对ActiveRecord的标准调用.对于日期,传递一个与"记住我"持续时间长度相匹配的值.在我的示例中,这将清除已停用两周的所有会话.

ActiveRecord::SessionStore::Session.delete_all(["updated_at < ?", 2.weeks.ago])
Run Code Online (Sandbox Code Playgroud)

如下面的@journeyer所述,如果使用Devise gem,可以参考Devise的配置.

ActiveRecord::SessionStore::Session.delete_all(["updated_at < ?", Devise.remember_for.ago])
Run Code Online (Sandbox Code Playgroud)

如果使用Sorcery宝石,可以参考Sorcery的配置.

ActiveRecord::SessionStore::Session.delete_all(["updated_at < ?", User.sorcery_config.remember_me_for.ago])
Run Code Online (Sandbox Code Playgroud)

  • 对不起,上面应该是:ActiveRecord :: SessionStore :: Session.delete_all(["updated_at <?",Devise.remember_for.ago]) (3认同)
  • 如果你使用Devise,你可以使用`Devise.remember_for``ActiveRecord :: SessionStore :: Session.delete_all(["updated_at <?",Devise.remember_for])获得remember_for持续时间. (2认同)

Tho*_*ory 23

关于你的问题的一篇好博文:http://blog.brightbox.co.uk/posts/clearing-out-rails-sessions

解决方案是创建自定义rake任务:

task :clear_expired_sessions => :environment do
    sql = 'DELETE FROM sessions WHERE updated_at < DATE_SUB(NOW(), INTERVAL 1 DAY);'
    ActiveRecord::Base.connection.execute(sql)
end
Run Code Online (Sandbox Code Playgroud)

......每天用cron工作来运行它.

  • Postgres等价:`sql ="DELETE FROM sessions WHERE updated_at <(CURRENT_TIMESTAMP - INTERVAL'1天');"` (2认同)

Fre*_*ung 6

当您调用reset_sessionrails时,将从会话表中删除该行.但是并非每个会话都会reset_session调用它:如果用户在没有注销的情况下关闭浏览器,那么浏览器将丢弃会话cookie,因此会话行将永远不会再次使用,但reset_session不会被调用.

Rails不会清除那些积累的残余物 - 你可以根据自己的需要对它进行任何管理.在之前的作业中,我们使用运行删除旧会话行的cronjob.