【问题标题】:Use ActiveModel::Serializers to include two parent json arrays使用 ActiveModel::Serializers 包含两个父 json 数组
【发布时间】:2013-05-11 21:40:55
【问题描述】:

我正在尝试发送如下所示的前端应用程序 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::Serializers。

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

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

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

ActiveModel::Serializers 是否允许我尝试做的事情?如果有,怎么做?

提前非常感谢!

【问题讨论】:

    标签: json ruby-on-rails-3 ember.js activemodel active-model-serializers


    【解决方案1】:

    我通过创建一个名为 Search 的类来解决这个问题,该类包含 ActiveModel 的各个方面

    class Search
      include ActiveModel::Serialization
      include ActiveModel::SerializerSupport
    
      attr_accessor :facilities, :instructors
    
      def initialize(facilities, instructors)
        @facilities, @instructors = facilities, instructors
      end
    end
    

    然后我创建了一个 Searches 控制器(那里没什么有趣的)和一个 Search 序列化器。

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

    这会创建我想要的 json,尽管现在它被包装在搜索哈希中:

    {search: {
      #the stuff I wanted 
    }}
    

    【讨论】:

    • 这与我遇到的问题完全相同。感谢您的精彩回答!
    • 感谢您的解决方案。它可以工作,您可以通过在渲染器中设置root: false 来禁用根节点“搜索”。经过审查,我们决定不将这种方法与 2 个根元素一起使用,我们最终使用了 2 个独立的 API 端点,这使我们的设计更加简单。
    【解决方案2】:

    这是我的解决方案:

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

    有点脏。它基本上实例化了除了手动和两次之外将被实例化的内容。两个结果集都使用 ActiveModel::Serializers 以正确的格式呈现。

    【讨论】:

    • 由于最近对 active_model_serializers 的更新,此解决方案不再有效。应用程序应该发出两个单独的请求。
    • 我只是好奇,根据您的评论,为什么这不再有效?我正在使用最新版本,一切运行顺利。
    • 自从发布此解决方案后,我了解到为什么以源链接的形式提供大量附加信息如此重要。不幸的是,我无法破译我当时在说什么,就像你一样。我为没有更冗长而道歉,并且将来会开始变得更冗长。我认为这与 activemodel 序列化程序期望输出的外观以及与某些外部库的不兼容有关。如果您只需要原始输出,此解决方案可能仍然有效。
    • 我发现一般来说最好不要与惯例作斗争。因此,如果库本身不提供一次返回两个结果集的方法,我倾向于执行两个请求。
    猜你喜欢
    • 2017-11-01
    • 2014-06-19
    • 2013-07-19
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多