100 9.58
我想在类的属性中使用转换后的名称/值,而不是我们从数据库中获得的。我需要这样做的原因是我有两个版本的应用程序,指向同一个数据库,但较新的版本最近更新了列名。因此,对于所有使用旧版本的应用程序,必须使其兼容。
Environment: Rails version: 6.0.3.3 & Ruby version: ruby 2.7.1p83
假设有一个类叫做Sprinter。短跑表看起来像:
s你可以使用一个序列化层来处理JSON中模型的不同表示,而不是乱搞.as_json
的内部或你的模型如何进行序列化。
例如,你可以使用ActiveModel::Serializers或JBuilder,如果你喜欢的话,甚至可以使用你自己的Serializers。
module API
module V2
class SprinterAdapter
def intialize(sprinter)
@sprinter = sprinter
end
def to_json
@sprinter.to_json.except("m", "s").merge(
"cm" => @sprinter.m * 100,
"ms" => @sprinter.s * 1000
)
end
end
end
end
在控制器中你可以使用序列化器来呈现资源:
module API
module V2
class SprintersController < ApplicationController
def show
@sprinter = Sprinter.find(params[:id])
render json: SprinterAdapter.new(@sprinter)
end
end
end
end
:
- Thoughtbot:更好的序列化,少as_json Ruby工具箱
可以通过select fromSprinter
:
Sprinter.select(:id, :name, 'm * 100 AS cm', 's * 1000 AS ms')
但不确定如何与as_json组合