首页 > 解决方案 > 为嵌套关联选择序列化程序

问题描述

我在我的 Rails API 中使用 Active Model Serializer,但无法让嵌套的序列化器工作(我相信是因为我有多个序列化器用于同一资源)。我的模型设置如下:

class Program < ActiveRecord::Base
    acts_as_paranoid
    has_many :check_ins
end

class CheckIn < ActiveRecord::Base
    has_one :weigh_in, dependent: :destroy
end

class WeighIn < ActiveRecord::Base
    belongs_to :check_in
end

在我的ProgramsController我有以下内容:

def index
    programs = Client.find(params[:client_id]).programs
    render json: programs, status: :ok, each_serializer: API::ProgramSerializer, include: "**"
end

在我的API::ProgramSerializer我有以下内容:

class API::ProgramSerializer < ActiveModel::Serializer
    attributes :created_at, :position, :id

    has_many :check_ins, each_serializer: API::CheckInsIndexSerializer
end

我遇到的问题是我既有. 又有. 尽管我指定我想使用. 有没有解决的办法? API::CheckInsIndexSerializerAPI::CheckInSerializerinclude: "**"API::CheckInSerializerAPI::CheckInsIndexSerializer

标签: ruby-on-railsactive-model-serializers

解决方案


我能够通过修改以下内容来解决这个ProgramsController问题API::ProgramSerializer

def index
    programs = Client.find(params[:client_id]).programs
    render json: programs, status: :ok, each_serializer: API::ProgramSerializer
end

class API::ProgramSerializer < ActiveModel::Serializer
    attributes :created_at, :position, :id, :check_ins

    def check_ins
        ActiveModel::SerializableResource.new(object.check_ins,  each_serializer: API::CheckInsIndexSerializer)
    end
end

我必须删除include: "**"并定义如何check_ins显式加载。


推荐阅读