Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何将jsonb字段值视为序列化中的一级属性?_Ruby On Rails_Ruby_Serialization_Json Api_Fastjsonapi - Fatal编程技术网

Ruby on rails 如何将jsonb字段值视为序列化中的一级属性?

Ruby on rails 如何将jsonb字段值视为序列化中的一级属性?,ruby-on-rails,ruby,serialization,json-api,fastjsonapi,Ruby On Rails,Ruby,Serialization,Json Api,Fastjsonapi,我有一个使用postgresql jsonb字段的Rails后端。我想使用gemfast\u jsonapi,但我并不喜欢它 我有一个jsonb字段,它几乎就是我想要序列化的模型。但是,我还没有弄清楚如何为它们创建json属性(将它们序列化为一等公民)。因此,与其: { "attributes":{ "data":{ "title":"ok", "author":"masta p" }, "created_

我有一个使用postgresql jsonb字段的Rails后端。我想使用gem
fast\u 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\u jsonapi
这是不可能的。序列化程序类中声明的每个属性都被分派到活动记录对象。您将看到库如何序列化给定对象

因此,如果您想将jsonb对象序列化为第一公民,我认为有两种方法。首先,您将扩展
FastJsonapi::Attribute
类,然后重写
serialize
方法。但我不推荐这种方式,因为这样做很容易出错

第二种方法是从jsonb对象显式声明字段。对于istance,我认为以下解决方法适合您的问题

类TestSerializer 包含FastJsonapi::ObjectSerializer JSONB_属性=%i[标题作者评论\u计数] JSONB|U ATTRIBUTES.each do|attr| 属性attr do | object| object.data[attr.to_s]如果object.data的保护值为零 结束 结束 结束 这比扩展序列化程序类要好得多