如何使用带有“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_on
和 updated_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_attribute
:https://api.rubyonrails.org/classes/Module.html#method-i-alias_attribute
您可以在您想要的模型中使用alias_attribute :updated_at, :updated_on
。这样您就不需要更改数据库列,或覆盖 cache_version
方法。
我正在开发一个新的 Rails 6 API 应用程序(服务于 React.js 前端和其他服务),由于历史原因,它共享一个后端 MySQL 数据库以及自 Rails.
早期就存在的另外两个应用程序我们希望新的 API 性能尽可能好,所以我一直希望使用 Rails' HTTP 缓存(stale?
、fresh_when
等.) 以确保对同一端点的重复请求可以利用浏览器级缓存。特别是,我有一个仪表板页面的集合查询,我非常希望它可以缓存。
不幸的是,这个老派数据库使用 created_on
和 updated_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_attribute
:https://api.rubyonrails.org/classes/Module.html#method-i-alias_attribute
您可以在您想要的模型中使用alias_attribute :updated_at, :updated_on
。这样您就不需要更改数据库列,或覆盖 cache_version
方法。