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

How can I use Rails' HTTP caching helpers with an `updated_on` timestamp?

我正在开发一个新的 Rails 6 API 应用程序(服务于 React.js 前端和其他服务),由于历史原因,它共享一个后端 MySQL 数据库以及自 Rails.

早期就存在的另外两个应用程序

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

不幸的是,这个老派数据库使用 created_onupdated_on 作为其时间戳列名称,并且 fresh_when 和它调用的 ETag 生成器都希望调用更新时间戳 updated_at.

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

我可以手动将 last_modified 值计算为 stale?fresh_when,但是 etag 生成依赖于 ActiveRecord::Relation#cache_key_with_version,后者又调用ActiveRecord::Relation#cache_version 及其默认时间戳属性名称 :updated_at

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

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

您可以在您想要的模型中使用alias_attribute :updated_at, :updated_on。这样您就不需要更改数据库列,或覆盖 cache_version 方法。