ruby-on-rails - 如何将jsonb字段值视为序列化中的一等属性?
问题描述
我有一个使用 postgresql jsonb 字段的 Rails 后端。我想使用这颗宝石fast_jsonapi
,但还没有结婚。
我有一个 jsonb 字段,它几乎就是我想要序列化的模型。但是,我还没有弄清楚如何为它们制作 json 属性(将它们序列化为一等公民。)所以,而不是:
{
"attributes":{
"data":{
"title":"ok",
"author":"masta p"
},
"created_at":"2019-02-16T17:40:21.477Z",
"updated_at":"2019-02-16T17:40:21.477Z"
}
}
我不需要额外的“数据”命名空间,并且希望它是:
{
"attributes":{
"title":"ok",
"author":"masta p"
"created_at":"2019-02-16T17:40:21.477Z",
"updated_at":"2019-02-16T17:40:21.477Z"
}
}
这样做的低成本方法是什么?
解决方案
因为fast_jsonapi
这是不可能的。在序列化程序类中声明的每个属性都被分派到活动记录对象。您将在此处看到该库如何序列化给定对象。
因此,如果您想将 jsonb 对象序列化为第一个公民,我认为您有两种方法。首先,您将扩展FastJsonapi::Attribute
类,然后覆盖该serialize
方法。但我不推荐这种方式,因为这真的很容易出错。
第二种方法是显式声明来自 jsonb 对象的字段。例如,我认为以下解决方法适合您的问题。
class TestSerializer
include FastJsonapi::ObjectSerializer
JSONB_ATTRIBUTES = %i[title author review_count]
JSONB_ATTRIBUTES.each do |attr|
attribute attr do |object|
object.data[attr.to_s] if object.data # Protection againts nil value
end
end
end
这比扩展序列化程序类要好得多。
推荐阅读
- pyspark - 如何根据列中数组的第一个值过滤 pyspark 数据帧?
- mongodb - 为什么在 ECS 环境下 Mongo Docker 官方镜像无法读取 /docker-entrypoint-initdb.d?
- macos - 是否可以为桌面 Mac 添加 Mac Outlook 自定义插件
- serialization - 哪个存档加载速度更快
- google-chrome - 无法使用 Owin 在 Google Chrome(最新版本)浏览器 MVC5 中通过第三方登录提供商 (Google) 登录
- python - fastApi中的python全局变量无法正常工作
- javascript - 如何防止从foreach订阅服务两次
- c# - 内存地址,知道dll的偏移量和基地址如何获取内存地址来设置值
- ios - Interface Builder 中的 iOS 安全区域
- assembly - 了解进入标签时 gdb 中“堆栈”显示的内容