Ruby on rails 如何清除rails会话表

Ruby on rails 如何清除rails会话表,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我将活动记录存储用于rails会话存储 在很短的时间内,会话表的大小增加了很多。在一段时间后,这些会话行是如何转储的。还是我应该在24小时内手动清除它们一次?我建议使用cron作业或其他方法清除rails会话。可能不是24小时,这取决于您希望用户会话可用的时间。Rails为此提供了一个rake任务 rake数据库:会话:清除 调用reset\u sessionrails将从session表中删除该行。但是,并非每个会话都会调用reset\u session:如果用户在未注销的情况下关闭浏览器,则

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


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

我建议使用cron作业或其他方法清除rails会话。可能不是24小时,这取决于您希望用户会话可用的时间。Rails为此提供了一个rake任务

rake数据库:会话:清除


调用
reset\u session
rails将从session表中删除该行。但是,并非每个会话都会调用
reset\u session
:如果用户在未注销的情况下关闭浏览器,则浏览器将丢弃会话cookie,这样会话行将不再使用,但不会调用
reset\u session


Rails不会为您清除积存的积垢-您可以根据需要对其进行任何维护。在以前的作业中,我们用于运行删除旧会话行的cronjob。

关于您的问题的一篇好博客文章:

解决方案是创建自定义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
task:clear\u expired\u sessions=>:environment do
sql='DELETE FROM sessions,其中更新时间为

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

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

ActiveRecord::SessionStore::Session.delete_all(["updated_at < ?", 2.weeks.ago])
ActiveRecord::SessionStore::Session.delete_all([“更新时间<?”,2周前])
如@journeyer所述,如果使用Desive gem,可以参考Desive的配置

ActiveRecord::SessionStore::Session.delete_all(["updated_at < ?", Devise.remember_for.ago])
ActiveRecord::SessionStore::Session.delete_all(["updated_at < ?", User.sorcery_config.remember_me_for.ago])
ActiveRecord::SessionStore::Session.delete_all([“updated_at<?”,designe.memory_for.ago])
如果使用魔法宝石,你可以参考魔法的配置

ActiveRecord::SessionStore::Session.delete_all(["updated_at < ?", Devise.remember_for.ago])
ActiveRecord::SessionStore::Session.delete_all(["updated_at < ?", User.sorcery_config.remember_me_for.ago])
ActiveRecord::SessionStore::Session.delete_all([“updated_at<?”,User.sorcery_config.memory_me_for.ago])

AFAIK此任务还将删除活动会话。正确,此rake任务将删除所有会话。这可能有害,请勿使用。Postgres等效项:
sql=“从更新时间为的会话中删除”<(当前时间戳-间隔“1天”);“
太好了。我还建议将会话保持在nosql数据库中,而不是在那里。也许是Redis。使用tripoid访问实际的DB代价太高,这很好,但是如果Rails安装程序通过Mongoid使用MongoDB进行DB存储,这将不起作用。但是我们已经设计出了一个答案。如果您使用Deave,您可以通过
Deave获得持续时间的记住。记住
ActiveRecord::SessionStore::Session的记住。删除所有([更新时间:<?”,Deave.Membered\u for])
对不起,上面应该是:ActiveRecord::SessionStore::Session.delete_all([“updated_at<?”,design.memory_for.ago])会话cookie和持久cookie不同,不应进行比较。
design.memory\u for
时间段用于持久cookie,而不是会话(无论您是否登录都存在)。它默认为2周,但可能是几年。另一方面,会话只能持续到您关闭浏览器。两周就足够了,这是正确的。如果在浏览器中删除会话cookie,该会话行也将保留在表中。