2015-09-29 4 views
5

Ich verwende die JSONAPI format zusammen mit Active Model Serializers, um eine API mit rails-api zu erstellen.Wie wähle ich die Attribute aus, die ich für aktive Modell-Serializer-Beziehungen haben möchte

Ich habe einen Serializer, der eine spezifische post zeigt, die viele topics hat und derzeit unter Beziehungen diese Themen auflistet. Es listet derzeit nur die ID und den Typ auf. Ich möchte auch den Titel des Themas zeigen.

Einige würden sagen, include: 'topics' in meinem Controller zu verwenden, aber ich brauche nicht den vollständigen Thema Datensatz, nur seinen Titel.

Frage: Wie lege ich fest, welche Attribute ich von Themen anzeigen möchte?

Was ich

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

habe Was ich will

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

Meine aktuellen Serializer Klassen EDIT: Das ist, was ich nach bitte bin.

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 

Eines, was ich versuchte, - gibt es eine Antwort unten, dass diese Arbeit macht, aber es ist nicht wirklich das, was ich bin nach.

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

    belongs_to :domain 
    belongs_to :user 

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

Antwort

5

So stellen Sie sicher, wie so ein Hash oder ein Array von Hashes zurück:

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

Vielen Dank! Das hat funktioniert. – alassiter

+0

Ich habe diese Antwort geändert b/c hat sie eines der Probleme beantwortet, die ich vorgestellt habe. Ich wollte diese Frage nicht verwechseln, aber nachdem ich das gleiche Problem erneut angegangen war, wurde mir klar, dass ich nicht klar war. Ich bin mir der Etikette nicht sicher, also bitte vergib mir. Die Frage sollte dazu dienen, Attribute auf die Beziehung zu spezifizieren, siehe .. "Was ich will" und die Antwort hier erweitert sich auf eines der Dinge, die ich versuchte. Es funktioniert, aber was ich wirklich will, ist anders. – alassiter

+0

Ich sehe in den Dokumenten kein gutes Beispiel dafür, also würde ich sagen, dass es nicht unterstützt wird oder nicht so funktioniert, wie Sie es möchten. Es scheint, als ob die Funktion, die eine Verknüpfung überschreibt, den Bereich und nicht die Attribute ändern soll. siehe hier https://github.com/rails-api/active_model_serializers#user-content-overriding-association-methods. Wenn Sie die zugehörigen Daten nicht in die Steuerung einbeziehen oder laden, führt dies nicht zu einem N + 1 im Serialisierer? Wenn Sie Postgres verwenden, können Sie JSON von der Datenbank zurückgeben oder die Daten in SQL massieren und einen benutzerdefinierten Serializer verwenden. – penner

0

Statt Themen Verfahren zur Definition, es besser ist, mit explizit separates Thema Serializer definieren Sie angeben, welche Attribute tun müssen Sie einschließen. Dies ist ein sauberer und wartungsfreundlicherer Ansatz als das Definieren der Themenmethode.

Versuchen Sie wiederum zu vermeiden, Methoden für Relationen so weit wie möglich zu definieren, es ist nicht sauber, weder wartbar.

Verwandte Themen