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

时间:2014-09-23 18:22:07

标签: ruby-on-rails serialization

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

假设我有3个型号:

Users has_many ordershas_many addresses

通常在我的Users serializer class中我会has_many orders model,而订单模型序列化器与has_many的关系addresses

我现在有一个用户控制器,我不希望订单输出,但不是嵌套地址。这可以在不创建全新的序列化程序类的情况下完成吗?

更新,澄清:

我有以下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来自订单的地址。

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

2 个答案:

答案 0 :(得分:1)

您可以使用定义序列化程序选项的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

就是这样。在每个不需要嵌套地址的控制器中指定此选项。

答案 1 :(得分:0)

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