2015-09-29 10 views
5

Sto utilizzando il JSONAPI format insieme a Active Model Serializers per creare un API con rails-api.Come selezionare gli attributi desiderati per le relazioni di serializzazione di modelli attivi

Ho un serializzatore che mostra uno specifico post che ha molti topics e attualmente, nelle relazioni, elenca quegli argomenti. Attualmente elenca solo ID e tipo. Voglio mostrare anche il titolo dell'argomento.

Alcuni direbbero di utilizzare include: 'topics' nel mio controller, ma non ho bisogno del record di argomento completo, solo il titolo.

Domanda: Come si specificano gli attributi che si desidera visualizzare dagli argomenti?

Quello che ho

"data": { 
    "id": "26", 
    "type": "posts", 
    "attributes": { 
    "title": "Test Title 11" 
    }, 
    "relationships": { 
    "topics": { 
     "data": [ 
     { 
      "id": "1", 
      "type": "topics" 
     } 
     ] 
    } 
    } 
} 

quello che voglio

"data": { 
    "id": "26", 
    "type": "posts", 
    "attributes": { 
    "title": "Test Title 11" 
    }, 
    "relationships": { 
    "topics": { 
     "data": [ 
     { 
      "id": "1", 
      "type": "topics", 
      "title": "Topic Title" 
     } 
     ] 
    } 
    } 
} 

Le mie lezioni serializzatore attuali EDIT: questo è quello che sto cercando per favore.

class PostSerializer < ActiveModel::Serializer 
    attributes :title 

    belongs_to :domain 
    belongs_to :user 

    has_many :topics, serializer: TopicSerializer 

    def topics 
    # THIS IS WHAT I AM REALLY ASKING FOR 
    end 
end 

class TopicSerializer < ActiveModel::Serializer 
    attributes :title, :description 

    belongs_to :parent 
    has_many :children 
end 

Una cosa che ho cercato - c'è una risposta al di sotto che rende questo lavoro, ma non è davvero quello che sto cercando.

class PostSerializer < ActiveModel::Serializer 
    attributes :title, :topics 

    belongs_to :domain 
    belongs_to :user 

    def topics 
    # THIS WAS ANSWERED BELOW! THANK YOU 
    end 
end 

risposta

5

Basta fare in modo di restituire un hash o array di hash in questo modo:

def videos 
    object.listing_videos.collect do |lv| 
     { 
     id: lv.video.id, 
     name: lv.video.name, 
     wistia_id: lv.video.wistia_id, 
     duration: lv.video.duration, 
     wistia_hashed_id: lv.video.wistia_hashed_id, 
     description: lv.video.description, 
     thumbnail: lv.video.thumbnail 
     } 
    end 
    end 
+0

Grazie! Ha funzionato. – alassiter

+0

Ho svitato questa risposta b/c ha risposto a uno dei problemi che ho presentato. Non volevo confondere questa domanda, ma dopo aver incontrato di nuovo lo stesso problema, mi sono reso conto che non ero chiaro. Non sono sicuro dell'etichetta su questo, quindi per favore perdonami. La domanda era intesa a specificare gli attributi sulla relazione, vedere .. "Cosa voglio" e la risposta qui si espande su una delle cose che ho provato. Funziona, ma quello che voglio veramente è diverso. – alassiter

+0

Non vedo un buon esempio di questo nei documenti, quindi direi che non è supportato o non funziona in quel modo che ti piacerebbe. Sembra che la funzione che sovrascrive un'associazione abbia lo scopo di modificare l'ambito e non gli attributi. vedere qui https://github.com/rails-api/active_model_serializers#user-content-overriding-association-methods. Se non si includono o si caricano i dati associati nel controller, non verrà generato un N + 1 nel serializzatore? Se stai usando postgres potresti restituire JSON dal db o massaggiare i dati in SQL e avere un serializzatore personalizzato. – penner

0

Invece di definire metodo di argomenti, è meglio definire argomento serializzatore separata con specificando esplicitamente che attribuisce fare è necessario includere. Questo approccio è più pulito e più gestibile, quindi definisce il metodo degli argomenti.

class PostSerializer < ActiveModel::Serializer 
    attributes :title 

    belongs_to :domain 
    belongs_to :user 
    # remember to declare TopicSerializer class before you use it 
    class TopicSerializer < ActiveModel::Serializer 
    # explicitly tell here which attributes you need from 'topics' 
    attributes :title 
    end 
    has_many :topics, serializer: TopicSerializer 
end 

Anche in questo caso, cercare di evitare di definire i metodi per le relazioni, per quanto possibile, non è pulita, né mantenibile.

Problemi correlati