Rails 如何知道何时从 `sessions` 表中删除记录?
Posted
技术标签:
【中文标题】Rails 如何知道何时从 `sessions` 表中删除记录?【英文标题】:How does Rails know when to delete a record from the `sessions` table? 【发布时间】:2011-07-27 03:31:36 【问题描述】:Rails 如何知道何时从会话表中删除记录?
例如,如果用户访问网站,创建了一个会话记录,但是当用户关闭浏览器窗口时,服务器没有收到任何通知,那么 Rails 是如何从会话表中删除记录的呢?
【问题讨论】:
【参考方案1】:有更简单的方法:
ActiveRecord::SessionStore::Session.delete_all(["updated_at < ?", 12.hours.ago])
您可以在 Controller 中的一些操作之后调用它,这段代码会杀死所有死会话。
当然这是有争议的技术,但最简单。
Full story
【讨论】:
我真的很想异步执行类似的操作,例如从 cronjob 执行。 这很好用,通过 rails runner 和任何时候 gem 将其作为 cron 作业运行。 我们遇到了类似的问题,不想通过 cron 运行它,所以我们正在试验 mysql 事件:dev.mysql.com/doc/refman/5.5/en/create-event.html。希望这可以帮助其他人遇到同样的事情。 这里是更新的“全文”链接,认为使用数据存储是一种有争议的技术。 isnorcreative.com/blog/… 在使用多个 Web 服务器时,我们将数据库存储用于会话。这是一个很好的解决方案,只要您清除过时的会话,否则,它会非常膨胀。【参考方案2】:据我了解,您必须提供自己的会话到期实现。
This API page 给你一个相当不错的答案来了解它是如何工作的。您创建具有额外属性 created_on 和 updated_at 的数据库表(并且您可以免费获得时间戳),然后您只需通过查看 updated_at 属性创建一个作业以使它们随时到期。
This post 有如何运行作业的详细信息。
【讨论】:
以上是关于Rails 如何知道何时从 `sessions` 表中删除记录?的主要内容,如果未能解决你的问题,请参考以下文章
从 Rails 5 开始,何时需要手动设置 :inverse_of?
何时在 Elastic Beanstalk 中使用多容器 docker 来运行 Rails 应用程序?