首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在序列化为json时包含子关联?

如何在序列化为json时包含子关联?
EN

Stack Overflow用户
提问于 2018-10-14 16:38:11
回答 2查看 2.2K关注 0票数 0

在使用fast_jsonapi gem之前,我是这样做的:

代码语言:javascript
复制
render json: school.to_json(include: [classroom: [:students]])

我的SchoolSerializer看起来像:

代码语言:javascript
复制
class SchoolSerializer
  include FastJsonapi::ObjectSerializer
  attributes :name, :description, :classroom
end

如何将学生包括在JSON结果中?

此外,课堂关联包含但它显示了所有属性,是否有方法将教室属性映射到ClassroomSerializer?

代码语言:javascript
复制
class School < ApplicationRecord
  belongs_to :classroom
end

class Classroom < ApplicationRecord
  has_many :students
end
EN

回答 2

Stack Overflow用户

发布于 2018-10-14 17:53:03

代码语言:javascript
复制
class SchoolSerializer
  include FastJsonapi::ObjectSerializer
  attributes :name, :description

  belongs_to :classroom
end

# /serializers/classroom_serializer.rb
class ClassroomSerializer
  include FastJsonapi::ObjectSerializer
  attributes :.... #attributes you want to show
end

此外,您还可以添加额外的关联到您的学校模式,以访问学生。像这样

代码语言:javascript
复制
has_many :students, through: :classroom

然后将其直接包含在学校序列化程序中。

更新:还请注意,您可以直接指向所需的序列化程序类。(如果您想使用与模型名称不同的类作为示例)。

代码语言:javascript
复制
class SchoolSerializer
  include FastJsonapi::ObjectSerializer
  attributes :name, :description

  belongs_to :classroom, serializer: ClassroomSerializer
end
票数 2
EN

Stack Overflow用户

发布于 2019-12-11 03:21:25

render json: SchoolSerializer.new(school, include: "classrooms.students")

不同之处在于在呈现序列化程序时使用"include“。这告诉序列化程序向返回的JSON对象添加一个“包含”键。

代码语言:javascript
复制
class SchoolSerializer
  include FastJsonapi::ObjectSerializer

  belongs_to :classroom
  has_many :students, through: :classroom

  attributes :school_name, :description
end
代码语言:javascript
复制
StudentSerializer
  include FastJsonapi::ObjectSerializer

  belongs_to :classroom
  belongs_to :school

  attributes :student_name
end

render json: SchoolSerializer.new(school).serialized_json

将返回在窗体中只具有顶级标识符的一系列学生。

代码语言:javascript
复制
data: {
  id: "123"
  type: "school"
  attributes: {
    school_name: "Best school for Girls",
    description: "Great school!"
    ...

  },
  relationships: {
    students: [ 
      {
        id: "1234",
        type: "student"
      },
      { 
        id: "5678",
        type: "student"
      }
    ]
  }
}

include: "classroom.students"将以以下形式返回完整的序列化学生记录:

代码语言:javascript
复制
data: {
  id: "123"
  type: "school"
  attributes: {
    school_name: "Best school for Girls"
    ...

  },
  relationships: {
    classroom: {
      data: {
        id: "456",
        type: "classroom"
      }
    },
    students: [ 
      {
        data: {
          id: "1234",
          type: "student"
        }
      },
      { 
        data: {
          id: "5678",
          type: "student"
        }
      }
    ]
  },
  included: {
    students: {
      data { 
        id: "1234",
        type: "student",
        attributes: {
          student_name: "Ralph Wiggum",
          ...
        },
        relationships: {
          school: {
            id: "123",
            type: "school"
          },
          classroom: {
            id: "456",
            type: "classroom"
          }
        }
      }, 
      data: {
        id: "5678",
        type: "student",
        attributes: {
          student_name: "Lisa Simpson",
          ...
        },
        relationships: {
          school: {
            id: "123",
            type: "school"
          },
          classroom: {
            id: "456",
            type: "classroom"
          }
        }
      }
    },
    classroom: {
      // Effectively
      // ClassroomSerializer.new(school.classroom).serialized_json
    },
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52804847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档