如何将jsonb字段值视为序列化中的第一类属性?

问题描述 投票:1回答:1

我有一个使用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"
   }
}

这样做成本低廉的方法是什么?

ruby-on-rails ruby serialization json-api fastjsonapi
1个回答
1
投票

对于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

这比扩展序列化程序类要好得多。

© www.soinside.com 2019 - 2024. All rights reserved.