【发布时间】:2021-06-07 00:16:06
【问题描述】:
我想在类的属性中使用转换后的名称/值,而不是从数据库中获得。我需要这个的原因是我有两个版本的应用程序指向同一个数据库,但较新的版本最近更新了列名。因此,对于所有使用旧版本的应用程序,必须使其兼容。
Environment: Rails version: 6.0.3.3 & Ruby version: ruby 2.7.1p83
假设有一个名为 Sprinter 的类。 Sprinter 表如下所示:
| id | name | m | s |
|---|---|---|---|
| 1 | Mr. Bolt | 100 | 9.58 |
sprinter 实例如下所示:
sprinter = {
"id" => 1,
"name" => "Mr. Bolt",
"m" => 100,
"s" => 9.58
}
旧版本需要不同的格式。现在我想要类似的东西:
sprinter = {
"id" => 1,
"name" => "Mr. Bolt",
"cm" => 10000, # transformed from `m`
"ms" => 9580 # transformed from `s`
}
m 列名已转换为 cm,值也已转换。 s 到 ms 的情况相同。值转换没什么大不了的,但变量名似乎是。
我更喜欢在获取对象时进行内部更新。但是,如果这不受支持,作为基本解决方案,我更愿意更改我发送给客户端的 json 表示。作为参考,我将它用作嵌套 include 的一部分,例如:
render status: :ok, json: {races: races}.as_json(
{:include => [:sprinters] }
)
谢谢。
【问题讨论】:
-
如何检查API调用是否来自使用旧版本或新版本的应用程序?
-
好吧,url 将有 /api/v100/... 和 /api/v101/... 基于此,请求将路由到可以处理该请求的特定服务器。
-
很好,这意味着有单独的控制器吗?对吗?
-
是的,你可以这么说。我计划仅在几周内支持 v100(旧),因此将在不同的服务器上运行它,并在新服务器中完全放弃它。
标签: ruby-on-rails json activerecord ruby-on-rails-6 backwards-compatibility