我正在开发一个新的 Rails 6 API 应用程序(同时为 React.js 前端和其他服务提供服务),由于历史原因,该应用程序与其他两个早期就存在的应用程序共享一个后端 MySQL 数据库的 Rails。
我们希望新 API 的性能尽可能高,所以我一直希望使用 Rails 的 HTTP 缓存(stale?
、fresh_when
等)来确保重复请求相同端点可以利用浏览器级缓存。特别是,我有一个仪表板页面的集合查询,我非常希望可以缓存该页面。
不幸的是,这个老式的数据库使用 created_on
和 updated_on
作为它的时间戳列名,并且 fresh_when
和它调用的 ETag 生成器都期望更新时间戳被称为 {{1 }}。
我们其他现有的应用程序到处都使用时间戳中的值,因此我不想强制更改总计数百行代码。
我可以手动将 updated_at
值计算为 last_modified
和 stale?
,但是 etag 生成依赖于 fresh_when
,而 ActiveRecord::Relation#cache_key_with_version
反过来调用 {{ 1}},其默认时间戳属性名称为 ActiveRecord::Relation#cache_version
。
有人对如何进行有任何建议吗?我并不反对在控制器中手动滚动我自己的缓存代码,但如果有一种方法可以利用尽可能多的 Rails 代码,那就太棒了。
答案 0 :(得分:2)
我能想到的一种解决方案是使用 alias_attribute
:https://api.rubyonrails.org/classes/Module.html#method-i-alias_attribute
您可以在您希望的模型中使用 alias_attribute :updated_at, :updated_on
。这样您就无需更改 db 列或覆盖 cache_version
方法。