停止嵌套活动模型序列化程序 gem 的数据



我正在使用活动模型序列化程序 gem,它现在工作正常。但是,我偶然发现了一个问题,我不想停止对检索到的数据进行嵌套。

假设我有 3 个模型:

Usershas_many ordershas_many addresses.

通常在我的Users serializer class中,我会对orders model有一个has_many,并且在订单中模型序列化程序与addresseshas_many关系。

我现在有一个用户控制器,我不想把订单放出来,但不想放嵌套地址。可以在不创建全新序列化程序类的情况下完成此操作吗?

更新,以澄清:

我有以下3种型号:

class User < ActiveRecord::Base
  has_many orders 
end
class Orders < ActiveRecord::Base
  belongs_to user
  has_many addresses
end
class Addresses < ActiveRecord::Base
  belongs_to order
end

我有 3 个与模型相同的序列化程序。

对于我的订单API,我也想检索地址,但是当我查询用户时,我只想要关联的订单而不是地址。就像现在一样,当我查询用户时,它都会返回所有订单和地址,因为我对订单中的地址has_many。

是为两个选项创建单独的序列化程序的唯一选择(只是感觉不是很干燥(?

可以使用default_serializer_options定义序列化程序选项的方法 此控制器使用的所有序列化程序及其子级。

#users_controller.rb
class UsersController < ApplicationController
  def default_serializer_options
    { include_addresses: false }
  end
end

然后重写订单序列化程序中的初始化方法以检查include_addresses标志的序列化程序选项

# order_serializer.rb
class OrderSerializer < ActiveModel::Serializer
  def initialize(object, options = {})
    options.reverse_merge! include_addresses: true # by default it should include addresses
    @include_addresses = options[:include_addresses]
    super
  end
  def include_addresses?
    @include_addresses
  end
end

仅此而已。在不需要嵌套地址的每个控制器中指定此选项。

您可以从序列化程序中删除has_many,它将停止包含关联。

最新更新