【问题标题】:In ActiveModel::Serializer, how to render json-api relationships with id only在 ActiveModel::Serializer 中,如何仅用 id 渲染 json-api 关系
【发布时间】:2015-09-27 18:07:12
【问题描述】:

使用 json-api 适配器使用 ActiveModel::Serializer (0.10.0.rc3),我如何才能在默认情况下仅呈现与 id 的关系?

考虑一下我的序列化器

class ASerializer < Api::V1::BaseSerializer
  attributes :id, :name
  has_many :bs
end

但是,这也会呈现BSerializer 中定义的所有属性。我可以定义一个BMiniSerializer 来仅渲染id,并将其用作 has_many :bs, serializer: BMiniSerializer,但这意味着我必须为所有模型执行此操作并将其添加到所有序列化器中。有没有更优雅的默认方式?

编辑

我想这就是 :include:fields 的用途。不幸的是,由于我为我的 API 控制器和序列化程序使用了与我的模型不同的命名空间,我需要明确指定关联模型的序列化程序,以便 :include:fields 工作。

【问题讨论】:

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


    【解决方案1】:

    让我以OrderOrderItem 类的例子来展示它。我还假设我们使用的是0.10.0.rc3 版本,因为在0.9.x 中它以另一种方式工作。

    您应该通过将参数传递给序列化程序来自定义您的 json。例如:

    render json: @orders, short: true
    

    现在可以在OrderSerializer的初始化器中访问参数:short

    def initialize(object, options = {})
      @short = options[:short]
      super
    end
    

    我们将此参数保存为@short 实例变量。现在我们可以定义order_items 函数,当使用short: true 调用时,它将只包含ids

    def order_items
      if @short
        object.order_items.map{|x| [:id,x.id]}.to_h
      else
        object.order_items
      end
    end
    

    【讨论】:

    • 我还没有尝试过这种方法,但是对于像order_items 这样的函数来说,必须为每个关联和每个模型定义这样的函数似乎很麻烦?还是以某种方式可以继承?
    猜你喜欢
    • 2015-08-05
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 2018-10-10
    • 2014-12-05
    相关资源
    最近更新 更多