在Rails中,如何从多个不同的ActiveModelSerializers / Models一次返回模型数据?

时间:2015-05-31 05:25:51

标签: ruby-on-rails json active-model-serializers

我有几个型号。我们称之为Widget和Gadget。

我的Widget和Gadget的#index看起来像这样

def index
    widgets = Widget.all
    if widgets
        respond_with widgets, each_serializer: Api::V1::WidgetSerializer
    else
        render json: { message: [t(:not_found_widget)] }, status: :not_found
    end
end     

def index
    gadgets = Gadget.all
    if gadgets
        respond_with gadgets, each_serializer: Api::V1::GadgetSerializer
    else
        render json: { message: [t(:not_found_gadget)] }, status: :not_found
    end
end 

我的序列号......

class Api::V1::WidgetSerializer < ActiveModel::Serializer
  attributes :id, :desc
end

 class Api::V1::GadgetSerializer < ActiveModel::Serializer
  attributes :id, :desc
end

但是,我需要一个返回1中的两个资源的资源。我需要同时返回小部件和小工具。所以json看起来像......

{
    "widgets": [
        {
            "id": 1,
            "desc": "One"
        },
        {
            "id": 2,
            "desc": "Two"
        }
    ],
    "gadgets": [
        {
            "id": 1,
            "desc": "One"
        },
        {
            "id": 2,
            "desc": "Two"
        }
    ]
}

我怎样才能做到这一点。像

这样的东西
widgets = Widget.all
gadgets = Gadget.all
respond_with widgets, each_serializer: Api::V1::WidgetSerializer, gadgets, each_serializer: Api::V1::GadgetSerializer

然而,这显然无效。

2 个答案:

答案 0 :(得分:3)

序列化程序类不必匹配AR模型。序列化程序类应该用作您要生成的JSON的表示形式。在您的示例中,我们假设要调用新的序列化程序DashboardSerializer,然后您可以将widgetsgadgets放在那里:

class DashboardSerializer < ActiveModel::Serializer
  self.root = false

  attributes :widgets, :gadgets

  def widgets
    Widget.all
  end

  def gadgets
    Gadget.all
  end
end

答案 1 :(得分:0)

我能看到这个工作的唯一方法是,如果你有一个具有多个小部件和has_many小工具的模型,它有自己的序列化器,因为AMS会将正确的序列化器应用于序列化器中声明的关联。

类似

        $.getJSON("https://api.twitch.tv/kraken/streams.json?channel=viagamehs,starladder1&callback=?", function(response){
            response = JSON.stringify(response);
            console.log(response);
        });