这应该与 一起使用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