如何在集合中对关联的属性进行分组(活动模型序列化程序)

How to group Associations' attributes in a Collection (Active Model Serializer)

考虑以下两个实体:帖子、作者

class PostSerializer < ActiveModel::Serializer
  attributes :id, :title, author_id
  belongs_to :author
end

Class AuthorSerializer < ActiveModel::Serializer
  attributes :id, :name
end

使用 'JSON' 适配器,对于 PostsController 的索引操作,我们得到如下响应:

{
  "posts":[
    {
      "id":1,
      "title":"Hic consectetur et delectus",
      "author_id": 1,
      "author":{"id":1,"name":"Author-A"}
    },
    {
      "id":2,
      "title":"Hic consectetur et delectus",
      "author_id": 2,
      "author":{"id":2,"name":"Author-B"}
    },
    {
      "id":3,
      "title":"Hic consectetur et delectus",
      "author_id": 1,
      "author":{"id":1,"name":"Author-A"}
    }
  ]
}

是否可以将作者数据分组到帖子数据之外以进行旁加载? (如下图)

{
   posts:[{...}, {...}, {...}],
   authors:[
     {id:1, name:'Author-A'},
     {id:2, name:'Author-B'}
   ]
}

您似乎想模仿 jsonapi 包含的关系。所以,w json 适配器,post 有一个属性,为了简单起见,author_id,然后,你将 post 集合与作者分开渲染并生成响应,或者您将它们混合并减少它们。您也许可以只呈现为 [posts, authors]!

作为解决方法,我们创建了一个自定义适配器,扩展了 Json 适配器并在 serializable_hash(...) 方法

中将散列修改为我们想要的格式
class CustomAdapter < ActiveModelSerializers::Adapter::Json
  def serializable_hash(options = nil)
    result_hash = super(options)
    ... code to modify hash format ...
    result_hash
  end
end