AMS:如何使用集合序列化器?

时间:2015-04-25 11:03:27

标签: ruby-on-rails active-model-serializers

我的意思是如何实现序列化程序来处理集合?

从活动模型序列化程序文档:

render json: @posts, serializer: PaginatedSerializer, each_serializer: PostPreviewSerializer

PaginatedSerializer应如何实施?

我做了类似的事情:

@posts = Post.all
render json: @posts

它工作正常,不需要也不需要一些特殊的集合序列化器,也不需要每个序列化器。

所以现在我很困惑为什么你需要一个集合序列化器。

2 个答案:

答案 0 :(得分:1)

要开始回答"为什么需要收集序列化程序"

我有一些控制器方法返回"未排序"像这样的列表:

[ {
 id: 2,
 collection_id: 3,
 text_choice: "Cover"
},
{
 id: 3,
 collection_id: 3,
 text_choice: "Remix"
},
{
 id: 4,
 collection_id: 4,
 text_choice: "Studio"
} ]

但是我想返回按collection_id分组的这些条目并回复像这样的JSON:

[
{
 "3": [ {
  id: 2,
  text_choice: "Cover"
 },
 {
  id: 3,
  text_choice: "Remix"
 } ]
},
{
 "4": [ {
 id: 4,
 text_choice: "Studio"
} ]
}
]

(对不起格式化:这样做"盲目"对于一个崇高的文本用户来说有点困难;)

所以我得出的结论是,我需要为此转换实现自己的CollectionSerializer。 但是和你一样,我找不到任何例子;实际上,你已经给出了目前最先进的答案! 我试着玩你的开始,可能会在GH上创造一个问题。

如果我得到任何东西我会更新......

对任何人:如果您了解我们,请随时帮助我们!

答案 1 :(得分:1)

如果没有列出序列化程序,我就不会看到如何在JSON数据中获得分页结果,但如果您实现了PostSerializer序列化程序,则可以获得一些序列化数据。

CollectionSerializerPaginationSerializer)是一个序列化程序,它为整个结果集提供属性,在JSON结果中提供分页数据,例如页数和总记录。

我在wiki page中看到了一个示例PaginationSerializer。它非常通用,因此适用于任何型号。

听起来你可能已经理解了PagePreviewSerializer部分,但我也会覆盖它,以防万一。它是一个序列化程序,用于决定页面上显示的每个帖子显示哪些属性。

可以使用rails g serializer post生成PaginatedSerializer(假设模型被调用" post"然后你只需要将它重命名为PostPreviewSerializer并为"属性添加额外的属性&# 34;定义取决于你想在json中显示哪些属性。例如,如果那些是你的属性,你可以用attributes :id, :title, :content声明它。

额外评论

我注意到按照wiki页面中PaginationSerializer继承自CollectionSerializer的说明。这个序列化程序并不存在于我的AMS gem版本中,但事实证明它只是ArraySerializer重命名。所以继承自ArraySerializer为我工作。