13

我想送我的前端应用程序的JSON看起来像这样:加载ActiveModel使用串行器::包括两个父JSON数组

{ 
    facilities: [ 
    {id: 5, name: 'happy days ranch', location: { address: '1424 Pastoral Lane', zipcode: '25245'}, instructor_ids: [2, 4, 9]} 
    ], 
    instructors: [ 
    {id: 4, name: 'Johnny Pheonix', skill: '8', picture: 'aws_url', facility_ids: [5, 8, 12} 
    ] 
} 

事情我已经试过

render :json => @facilities 

的序列化程序发现这一点。好极了!但是,这并不包括任何教练

render :json => {facilities: @facilities, instructors: @instructors} 

这给了我一个教练阵列和阵列的设施,但没有使用activemodel的串行器::。

render :json => [@facilities, @instructors] 

起初我对这个很兴奋,因为它给了我两个数组,它使用了ActiveModel :: Serializers。然而,这就是JSON的样子:

{facilities: [ 
    {facilities: [ 
    #my facilities data 
    ]}, 
    {facilities: [ 
    #my instructor data 
    ]} 
]} 

是什么我试图做甚至允许由ActiveModel :: Serializers?如果是这样,怎么样?

非常感谢!

回答

20

我通过创建一个类调用搜索并入加载ActiveModel的

方面
class Search 
    include ActiveModel::Serialization 
    include ActiveModel::SerializerSupport 

    attr_accessor :facilities, :instructors 

    def initialize(facilities, instructors) 
    @facilities, @instructors = facilities, instructors 
    end 
end 

然后,我创建了一个搜索控制器(什么有趣的存在)和搜索串行解决它。

class SearchSerializer < ActiveModel::Serializer 
    has_many :instructors, embed: :objects 
    has_many :facilities, embed: :objects 
end 

这造成我的期望JSON,虽然现在它被包裹在一个搜索哈希:

{search: { 
    #the stuff I wanted 
}} 
+0

这与我的问题完全相同。谢谢你的回答! – 2013-07-20 20:44:32

+2

谢谢你的解决方案。它可以工作,并且可以通过在渲染器中设置“root:false”来禁用根节点“搜索”。经过审查,我们决定不使用这种方法和2个根元素,我们最终使用了2个独立的API端点,这使我们的设计更简单。 – 2014-03-05 18:22:41

7

这是我的解决方案:

render json: { 
    facilities: ActiveModel::ArraySerializer.new(@facilities, each_serializer: FacilitySerializer, root: false), 
    instructors: ActiveModel::ArraySerializer.new(@instructors, each_serializer: InstructorSerializer, root: false) 
} 

这是一个有点脏。它基本上实例化将被实例化的内容,除了手动和两次。两个结果集都以正确的格式使用ActiveModel :: Serializer进行呈现。

+1

由于最近对active_model_serializers进行了更新,因此此解决方案不再有效。应用程序应提出两个独立的请求 – kequc 2014-11-13 15:19:48

+0

我只是好奇,根据你的评论,为什么这不再有效?我正在使用最新版本,并且一切运行顺利。 – David 2015-11-20 18:43:33

+0

自从发布这个解决方案后,我学到了为什么以链接形式提供大量附加信息非常重要。不幸的是,我无法破译我当时正在谈论的内容,与你一样。我很抱歉没有更加详细,将来会更加如此。我认为它与activemodel serialisers期望输出的外观以及与某些外部库不兼容有关。如果您只需要原始输出,则此解决方案可能仍然有效。 – kequc 2015-11-23 18:27:45