13

我正在尝试发送如下所示的前端应用程序 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 甚至允许我尝试做的事情吗?如果是这样,怎么做?

提前非常感谢!

4

2 回答 2

20

我通过创建一个名为 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 
}}
于 2013-05-12T01:23:47.733 回答
7

这是我的解决方案:

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

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

于 2014-10-02T16:12:06.783 回答