使用ActiveModel :: Serializers包含两个父json数组

Jef*_*les 13 json activemodel ruby-on-rails-3 ember.js active-model-serializers

我正在尝试发送我的前端应用程序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}
  ]
}
Run Code Online (Sandbox Code Playgroud)

我尝试过的事情

render :json => @facilities 
Run Code Online (Sandbox Code Playgroud)

串行器发现了这一点.好极了!但这并不包括任何教师

render :json => {facilities: @facilities, instructors: @instructors}
Run Code Online (Sandbox Code Playgroud)

这给了我一个教师数组和一个工具数组,但是没有使用activeModel :: Serializers.

render :json => [@facilities, @instructors]
Run Code Online (Sandbox Code Playgroud)

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

{facilities: [
  {facilities: [
    #my facilities data
  ]},
  {facilities: [
    #my instructor data
  ]}
]}
Run Code Online (Sandbox Code Playgroud)

即使ActiveModel :: Serializers允许,我也想做什么?如果是这样,怎么样?

非常感谢!

Jef*_*les 20

我通过创建一个包含ActiveModel方面的名为Search的类来解决它

class Search
  include ActiveModel::Serialization
  include ActiveModel::SerializerSupport

  attr_accessor :facilities, :instructors

  def initialize(facilities, instructors)
    @facilities, @instructors = facilities, instructors
  end
end
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个搜索控制器(没有什么有趣的)和一个搜索序列化器.

class SearchSerializer < ActiveModel::Serializer
  has_many :instructors, embed: :objects
  has_many :facilities, embed: :objects
end
Run Code Online (Sandbox Code Playgroud)

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

{search: {
  #the stuff I wanted 
}}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的解决方案.它可以工作,您可以通过在渲染器中设置`root:false`来禁用根节点"搜索".经过审核,我们决定不使用这种方法和2个根元素,我们最终选择了2个独立的API端点,这使我们的设计更简单. (2认同)

keq*_*quc 7

这是我的解决方案:

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

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