2013-10-11 40 views
2

FeedController返回一個包含這些類的對象的數組:Product,Kit和Article。用於數組中不同類的active_model_serializers

是否有可能以及active_model_serializers如何將productSerializer應用於Product,KitSerializer for Kit和ArticleSerializer for Article?

這應該呈現這樣的事情:

[ 
    { "type": "product", other fiels of Product }, 
    { "type": "kit", other fiels of Kit }, 
    { "type": "article", other fiels of Article } 
] 
+0

幾乎聽起來像這應該工作的開箱。你現在得到的結果是什麼? – spier

+0

我甚至無法啓動它,因爲each_serializer只有一個類... anoway,jbuilder看起來更好。 –

回答

2

這應該與version 0.9.0工作,version 0.10.0也許應該支持這一點,當它終於準備的方塊,但這個答案的時候,有人建議您不要使用該版本(主/ EDGE)

class MyArraySerializer < ActiveModel::ArraySerializer 

    def initialize(object, options={}) 
    options[:each_serializer] = get_serializer_for(object) 
    super(object, options) 
    end 

    private 
    def get_serializer_for(klass) 
    serializer_class_name = "#{klass.name}Serializer" 
    serializer_class = serializer_class_name.safe_constantize 

    if serializer_class 
     serializer_class 
    elsif klass.superclass 
     get_serializer_for(klass.superclass) 
    end 
    end 
end 

您可以修改get_serializer_for方法以更好地滿足您的需求。我用它來處理STI子類,其中我的父類擁有所有定義的屬性。然而,您將需要單獨的序列化程序來處理每個單獨的對象,因爲這些屬性很可能會有所不同。

然後在你的控制器:

render json: @my_array_of_mixed_classes, serializer: MyArraySerializer 
+0

如果你剛纔回答:) –

0

如果這是沒有可能的active_model_serializers開箱,也許原因是,你有你的API響應的有些非標設計。例如如果我不得不使用API​​,那麼對我來說反序列化你的JSON響應會很容易嗎?

一個辦法來解決這個問題,因此將重新設計你的API響應:

... 
"products" : [ ARRAY of Product ], 
"kits" : [ ARRAY of Kit ], 
"articles" : [ ARRAY of Article ] 
.... 

這將是更容易被消費者API反序列化也是如此。

+0

嗯,我猜active_model_serializers不應該指定我的API應該如何工作。此外,可以選擇部分爲每個類型與jbuilder,我想我會使用它。謝謝 –