2014-09-23 75 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