如何清除rails会话表

时间:2012-04-10 12:15:38

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

我将活动记录存储用于rails会话存储。

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

4 个答案:

答案 0 :(得分:32)

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

ActiveRecord::SessionStore::Session.delete_all(["updated_at < ?", 2.weeks.ago])

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

ActiveRecord::SessionStore::Session.delete_all(["updated_at < ?", Devise.remember_for.ago])

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

ActiveRecord::SessionStore::Session.delete_all(["updated_at < ?", User.sorcery_config.remember_me_for.ago])

答案 1 :(得分:22)

关于您的问题的好文章: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

...每天用cron作业运行它。

答案 2 :(得分:6)

当您致电reset_session时,rails会从会话表中删除该行。但是并非每个会话都会reset_session调用它:如果用户在没有注销的情况下关闭浏览器,则浏览器将丢弃会话cookie,以便会话行永远不会再次使用,但reset_session赢了不被人打电话。

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

答案 3 :(得分:0)

我建议使用cron作业清除rails会话。也许不是24小时,取决于您希望用户会话可用多长时间。 Rails为此

提供了rake任务
  

rake db:sessions:clear