2017-09-22 76 views
0

我想在另一个序列化程序中使用序列化程序,所以我可以在顶层添加键值对,但看起来像当我这样做时,较低级别的序列化程序不工作anymore-Rails嵌套序列化程序不使用方法来分解键

我的文件:

上述ItemsController

class ItemsController 

    def index 
    open_items = Items. 
     select("distinct on (open_item_id) *"). 
     preload(:company, :project) 

    total = open_items.count("id") 

    render json: { 
     total: total, 
     items: paginate(open_items, per_page: 2), serializer: ItemsSerializer 
    }, status: :ok 
    end 
end 

ItemsSerializer

class ItemsSerializer < ActiveModel::Serializer 
    attribute :total 
    has_many :items, serializer: ItemSerializer 
end 

ItemSerializer

类ItemSerializer < ::加载ActiveModel串行 属性:id, :项目, :公司

def company 
    { 
     name: object.company.name, 
     id: object.company.id 
    } 
    end 

    def project 
    { 
     name: object.project.name, 
     id: object.project.id 
    } 
    end 

end 

我想另一个键/值对到我的串行器输出在下面,这样我可以得到这样的东西:

{ 
    "total": 1, 
    "items": [ 
     { 
      "id": 42920375, 
      "company": { 
      "id": 123, 
      "name": "CompanyName" 
      }, 
      "project": { 
      "id": 456, 
      "name": "ProjectName" 
      } 
     } 
    ] 
} 

,但目前,我越来越:

{ 
    "total": 1, 
    "items": [ 
     { 
      "id": 42920375, 
      "company_id": 5842, 
      "project_id": 191741, 
     } 
    ] 
} 
+1

我认为问题是'ItemsSerializer'不能按照你想要的方式工作。它需要对应于活动的型号名称。你得到的是ActiveRecord自己的'to_json'方法的结果。 – EJ2015

回答

0

我不认为你可以使用ItemsSerializer这种方式。它需要对应于一个模型。

有源型号串器会自动序列化关联的每个对象都有自己的串行:

"In your controllers, when you use render :json for an array of objects, AMS will use ActiveModel::ArraySerializer (included in this project) as the base serializer, and the individual Serializer for the objects contained in that array."

所以没有必要重新发明轮子。只要这样做:

render json: paginate(open_items, per_page: 2), status: :ok 

然后,每个项目将由ItemSerializer处理。虽然我看不到在这里添加total的方法。