【问题标题】:How to have a serializer not include an associated table only for a specific method?如何让序列化程序不包含仅针对特定方法的关联表?
【发布时间】:2016-04-22 22:10:55
【问题描述】:

我正在学习如何使用active_model_serializers (gem)。在组织序列化程序中,我有:

has_many :nodes

所以现在,当我为组织的数据发出 API 请求时,它还会自动发送关联节点的属性。

例如,对组织控制器的 show 方法的 GET 请求会生成 JSON,其中包括组织和节点的属性。这行得通。

这对于 show 方法来说是完美的,但对于 index 方法的 GET 请求,我希望它只包含组织的属性,而不包含关联节点的属性。这可能吗?

【问题讨论】:

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


    【解决方案1】:

    您可以为不同的操作创建不同的序列化程序:

    class ShallowOrganizationSerializer < ActiveModel::Serializer
        attributes :id, :name # ....
    end
    
    class DetailedOrganizationSerializer < ShallowOrganizationSerializer
        has_many :nodes
    end
    

    在你的控制器中:

    class OrganizationController < ApplicationController
        def index
            # ...
            render json: @organizations, each_serializer: ShallowOrganizationSerializer
        end
    
        def show
            # ...
            render json: @organization, serializer: DetailedOrganizationSerializer
        end
    end
    

    【讨论】:

    • 太好了,谢谢!如果您知道我在哪里可以找到有关 each_serializer 及其与 serializer 的区别的更多信息,请告诉我(我在 gem 的文档中找不到它。
    • each_serializer 在序列化模型数组时使用。 serializer 在序列化单个模型时使用。
    • 基本上,如果您提供一个模型数组进行序列化,默认情况下,它将在该数组上使用ArraySerializer,并尝试自动发现每个模型使用哪个序列化程序。要覆盖用于整个数组的序列化程序,请定义 serializer。要覆盖数组中每个模型使用的序列化程序,请使用each_serializer。所以你可以在技术上这样做:render json: [model1, model2], serializer: MyCollectionSerializer, each_serializer: MySingleModelSerializer
    猜你喜欢
    • 2018-12-08
    • 2014-12-17
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2019-08-07
    相关资源
    最近更新 更多