首页 > 解决方案 > 如何将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"
   }
}

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

标签: ruby-on-railsrubyserializationjson-apifastjsonapi

解决方案


因为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

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


推荐阅读