2

FeedController 返回一个包含以下类对象的数组:Product、Kit 和 Article。

是否有可能以及如何使用 active_model_serializers 为 Product 应用 ProductSerializer、为 Kit 应用 KitSerializer 和为 Article 应用 ArticleSerializer?

这应该呈现如下内容:

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

2 回答 2

2

这应该与 一起使用version 0.9.0,并且version 0.10.0在最终准备好时应该开箱即用地支持它,但是在给出这个答案时,建议您不要使用该版本(主/边缘)

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
于 2014-11-06T15:27:27.850 回答
0

如果开箱即用的 active_model_serializers 无法做到这一点,则可能原因是您的 API 响应设计有些不标准。例如,如果我必须使用您的 API,反序列化您的 JSON 响应是否容易?

因此,解决此问题的一种方法是重新设计您的 API 响应:

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

API使用者也更容易反序列化。

于 2013-10-12T10:49:15.190 回答