如何使用带有“updated_on”时间戳的 Rails 的 HTTP 缓存助手?

问题描述

我正在开发一个新的 Rails 6 API 应用程序(同时为 React.js 前端和其他服务提供服务),由于历史原因,该应用程序与其他两个早期就存在的应用程序共享一个后端 MysqL 数据库的 Rails。

我们希望新 API 的性能尽可能高,所以我一直希望使用 Rails 的 HTTP 缓存(stale?fresh_when 等)来确保重复请求相同端点可以利用浏览器级缓存。特别是,我有一个仪表板页面的集合查询,我非常希望可以缓存该页面

不幸的是,这个老式的数据库使用 created_onupdated_on 作为它的时间戳列名,并且 fresh_when 和它调用的 ETag 生成器都期望更新时间戳被称为 {{1 }}。

我们其他现有的应用程序到处都使用时间戳中的值,因此我不想强制更改总计数百行代码

我可以手动将 updated_at 值计算为 last_modifiedstale?,但是 etag 生成依赖于 fresh_when,而 ActiveRecord::Relation#cache_key_with_version 反过来调用 {{ 1}},其认时间戳属性名称ActiveRecord::Relation#cache_version

有人对如何进行有任何建议吗?我并不反对在控制器中手动滚动我自己的缓存代码,但如果有一种方法可以利用尽可能多的 Rails 代码,那就太棒了。

解决方法

我能想到的一种解决方案是使用 alias_attributehttps://api.rubyonrails.org/classes/Module.html#method-i-alias_attribute

您可以在您希望的模型中使用 alias_attribute :updated_at,:updated_on。这样您就无需更改 db 列或覆盖 cache_version 方法。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...