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

时间:2021-05-11 09:36:07

标签: ruby-on-rails ruby http-caching

我正在开发一个新的 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 代码,那就太棒了。

1 个答案:

答案 0 :(得分:2)

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

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