【问题标题】:Choose serializer for nested association为嵌套关联选择序列化程序
【发布时间】:2020-05-13 17:16:44
【问题描述】:

我在我的 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::CheckInSerializer。尽管我指定我想使用API::CheckInsIndexSerializer,但include: "**" 似乎强制 Rails 使用API::CheckInSerializer。有没有解决的办法?

【问题讨论】:

    标签: ruby-on-rails active-model-serializers


    【解决方案1】:

    我可以通过修改ProgramsControllerAPI::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

    猜你喜欢
    • 2014-02-11
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2016-03-01
    相关资源
    最近更新 更多