我有一个使用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"
}
}
我不需要额外的'data'命名空间,并希望它是:
{
"attributes":{
"title":"ok",
"author":"masta p"
"created_at":"2019-02-16T17:40:21.477Z",
"updated_at":"2019-02-16T17:40:21.477Z"
}
}
这样做成本低廉的方法是什么?
对于fast_jsonapi
来说,这是不可能的。在序列化程序类中声明的每个属性都被分派到活动记录对象。您将看到here库如何序列化给定对象。
因此,如果您想将jsonb对象序列化为第一位公民,我认为您有两种方法。首先,您将扩展FastJsonapi::Attribute
类,然后覆盖serialize
方法。但我不推荐这种方式,因为这确实很容易出错。
第二种方法是明确声明json对象中的字段。例如,我认为以下解决方法适合您的问题。
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
这比扩展序列化程序类要好得多。