2013-10-11 3 views
2

FeedController는 Product, Kit 및 Article 클래스의 객체가있는 배열을 반환합니다.배열의 다른 클래스에 대한 active_model_serializers

active_model_serializers를 사용하면 Product 용 ProductSerializer, Kit 용 KitSerializer 및 Article 용 ArticleSerializer를 어떻게 적용 할 수 있습니까?

이이 같은 렌더링한다 :이 상자 밖으로 active_model_serializers에 더 할 수없는 경우

[ 
    { "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 하위 클래스를 처리 할 때이 메서드를 사용했습니다. 그러나 속성이 매우 다양하기 때문에 개별 객체마다 개별 serializer가 필요합니다. 컨트롤러에서 다음

:이이 상자 밖으로 작동합니다 같은

render json: @my_array_of_mixed_classes, serializer: MyArraySerializer 
+0

만약 당신이 먼저 대답 :) –

0

을, 어쩌면 이유는 당신이 당신의 API 응답의 다소 표준이 아닌 디자인을 가지고있다. 예 : API를 소비해야한다면 JSON 응답을 deserialize하는 것이 쉬울까요?

한 가지 방법은 그러므로 당신의 API 응답을 재 설계하는 것이 문제를 해결 얻을 :뿐만 아니라 API 소비자에 의해 역 직렬화하기 쉬울 것

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

합니다.

+0

글쎄, 내 API가 어떻게 작동해야하는지 active_model_serializers가 내게 지시해서는 안된다. 게다가, jbuilder를 가진 모든 타입에 대해 partial을 선택하는 것이 가능합니다. 그리고 나는 그것을 사용할 것입니다. 고마워 –

관련 문제