与rails 5中的其他属性嵌套时序列化数组

时间:2017-07-07 22:29:39

标签: ruby-on-rails json

我有一个ruby(2.4.0p0)rails(5.0.2)控制器,我希望从中返回一个包含Thing对象列表的json结果以及一些高级信息(例如来自Kaminari分页的next和previous )。

考虑与所有者关联的事物。 Thing有一个owner_id属性。

对于@things = Thing.page(1).per(2)我将能够使用

渲染json:@things

并得到;

double

好。如果我然后创建一个名为ThingSerializer.rb的序列化程序并定义所有者,使其添加“owner”:“CatInHat”而不是“owner_id”:1 这也有效;

[
    { "id": 1, "owner_id": 1, "name": "thing1" },
    { "id": 2, "owner_id": 1, "name": "thing2" }
]

这很好,但是,当我想添加更高级别的数据并将列表标记为“结果”时,例如当我尝试时,我的问题出现了;

渲染json:{next:“some_url_link”,上一篇:“some_other_url_link”,结果:@bags}

我想得到;

[
    { "id": 1, "owner": "CatInHat", "name": "thing1" },
    { "id": 2, "owner": "CatInHat", "name": "thing2" }
]

我得到的几乎就是上面但有“owner_id”:1而不是“owner”:“CatInHat” - 当我标记和嵌套我的列表时,似乎没有使用我的序列化器。使用序列化程序并获得此输出的适当方法是什么?

如果我创建config / initializers / active_model_serializers.rb并添加     ActiveModel :: Serializer.config.adapter =:json_api 它给了我一个类似的API,但我不知道它是否可以定制,以符合我上面需要的规格。

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

如果属性是ActiveRecord对象或ActiveRecord对象数组,render json: ...中的序列化逻辑似乎只会启动。由于您给它一个哈希值,它不会检查各个属性并递归地应用序列化程序。

您可以尝试手动应用ThingSerializer

render json: {
  next: ...,
  prev: ...,
  results: @things.map { |thing|
    ThingSerializer.new(thing).attributes
  },
}