2016-07-02 4 views
3

Ich habe eine Rails 5 App, in der ich den Edelstein active_model_serializers (https://github.com/rails-api/active_model_serializers) verwende. In meiner Anwendung habe ich ein Datenmodell vereinfacht, die etwa wie folgt aussieht:Rails API Design: beste Möglichkeit, andere Attribute mit json_api Beziehungen zu integrieren

# LocalizedString.rb 
has_many :translations 

# Translation.rb 
belongs_to :localized_string 

Ich versuche, die besten Praktiken von JSON API zu folgen, habe ich active_model_serializers wie folgt konfiguriert:

ActiveModelSerializers.config.adapter = :json_api 

Wenn ein Benutzer der API-Anfragen Übersetzungen (http://[root]/api/apps/117/translations) bekomme ich zur Zeit folgendes Ergebnis:

{ 
    "data": [ 
    { 
     "id": "152", 
     "type": "translations", 
     "attributes": { 
     "value": "Test", 
     }, 
     "relationships": { 
     "language": { 
      "data": { 
      "id": "1", 
      "type": "languages" 
      } 
     }, 
     "localized-string": { 
      "data": { 
      "id": "162", 
      "type": "localized-strings" 
      } 
     } 
     } 
    }, 
    [...] 

aus meiner localised-string I möchte auch ein anderes Attribut enthalten, das für den Konsumenten der API kritisch ist, und ich möchte keinen weiteren API-Aufruf machen müssen, um den Wert des Attributs zu erhalten. Ich frage mich, was ist die beste/empfohlene Weise, dies zu tun, die auch json_api folgt, wenn möglich.

So etwas wie dies funktionieren könnte:

"localized-string": { 
    "data": { 
    "id": "162", 
    "key": "my key value", # the attribute I need. 
    "type": "localized-strings" 
    } 
} 

Aber ich bin nicht sicher, wie das active_model_serializers Verwendung zu erreichen, oder ob es eine andere empfohlene Weg zu tun, was ich mit [json_api][1] wollen.

Zur Vervollständigung meiner relevanten Serializer Dateien sucht lik dies:

class TranslationSerializer < ActiveModel::Serializer 
    attributes :id, :value, :created_at, :updated_at 

    has_one :language 
    has_one :localized_string, serializer: LocalizedStringParentSerializer 
end 

class LocalizedStringParentSerializer < ActiveModel::Serializer 
    # I want to include the key attribute in my relationship object, but this doesn't work. 
    attributes :id, :key 
end 

Also, alle Ideen auf, was ich tun muss, um zu erreichen, was ich will?

Antwort

2

Pro Spezifikation werden Beziehungen durch Ressourcenobjektbezeichner dargestellt. Wenn Sie mehr als nur die ID und den Typ einschließen möchten, sollten Sie den Include-Parameter verwenden. In AMS, denke ich, wäre das "include: [: localizations], fields: {localizations: [: key]}" (nicht am Computer, aber ungefähr rechts)

Verwandte Themen