0

Je souhaite utiliser un sérialiseur dans un autre sérialiseur pour pouvoir ajouter une paire clé-valeur au niveau supérieur, mais il semble que lorsque je le fais, le sérialiseur de bas niveau ne fonctionne pas anymore-Sérialiseur imbriqué Rails n'utilisant pas les méthodes pour sortir les clés

Mes fichiers:

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

classe ItemSerializer < ActiveModel :: sérialiseur attributs: id, : projet, : entreprise,

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

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

end 

Je veux obtenir une autre paire clé/valeur à ma sortie sérialiseur ci-dessous afin que je puisse obtenir quelque chose comme ceci:

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

Mais actuellement, je reçois:

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

Je pense que le problème est que 'ItemsSerializer' ne fonctionne pas comme vous le souhaitez. Il doit correspondre à un nom de modèle actif. Ce que vous obtenez est le résultat de la méthode 'to_json' d'ActiveRecord. – EJ2015

Répondre

0

Je ne pense pas que vous pouvez utiliser ItemsSerializer cette façon. Il doit correspondre à un modèle.

Active-Model-sérialiseur automatiquement sérialiser chaque objet dans une association avec son propre sérialiseur:

"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."

Il n'y a donc pas besoin de réinventer les roues. Il suffit de faire ceci:

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

Ensuite, chaque article sera traité par ItemSerializer. Je ne vois pas un moyen d'ajouter total ici cependant.