2014-09-23 42 views
0

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

可以说我有3种型号:

Usershas_many ordershas_many addresses

常在我Users serializer class我必须有一个has_manyorders 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来处理订单中的地址。

是唯一选择为两个选项创建单独的序列化程序(它只是不觉得非常干)?

+0

你能澄清你想要的吗?你写了'我现在有一个用户控制器,我不想要命令,但不是嵌套的地址。这可以在不创建一个全新的串行器类的情况下完成吗?'这不完全清楚。 – 2014-09-26 23:33:38

+0

我曾经这样做过,我的解决方案可能适用于您。请粘贴您的代码示例,以便我可以发布我的答案。 – Benj 2014-09-27 06:20:18

回答

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 

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

0

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

+0

对不起,这个问题不是很精确。我希望在查询订单时为地址提供has_many,为此我需要返回地址。 – Dofs 2014-09-27 07:33:38