2012-10-29 18 views
23

Diese Frage bezieht sich auf AMS 0,8Aktiv Modell Serializer belongs_to

Ich habe zwei Modelle bekam:

class Subject < ActiveRecord::Base 
    has_many :user_combinations 
    has_ancestry 
end 

class UserCombination < ActiveRecord::Base 
    belongs_to :stage 
    belongs_to :subject 
    belongs_to :user 
end 

Und zwei Serializer:

class UserCombinationSerializer < ActiveModel::Serializer 
     attributes :id 
     belongs_to :stage 
     belongs_to :subject 
end 

class SubjectSerializer < ActiveModel::Serializer 
    attributes :id, :name, :description, :subjects 

    def include_subjects? 
    object.is_root? 
    end 

    def subjects 
    object.subtree 
    end 
end 

Wenn ein UserCombination serialisiert, Ich möchte den gesamten Teilbaum der Themen einbetten.

Wenn ich versuche, diese Einstellung zu verwenden, bekomme ich diesen Fehler:

undefined method `belongs_to' for UserCombinationSerializer:Class 

Ich versuchte, die UserCombinationSerializer zu diesem Wechsel:

class UserCombinationSerializer < ActiveModel::Serializer 
    attributes :id, :subject, :stage 
end 

In diesem Fall habe ich keine Fehler, aber der subject ist falsch serialisiert - nicht mit der SubjectSerializer. Meine Fragen

:

  1. Soll ich nicht in der Lage sein, eine belongs_to Beziehung in den Serializer zu benutzen?
  2. Wenn nicht - wie bekomme ich das gewünschte Verhalten - Einbetten des Themenbaums mit dem SubjectSerializer? Diese

Antwort

37

ist nicht wirklich elegant, aber es scheint zu funktionieren:

class UserCombinationSerializer < ActiveModel::Serializer 
    attributes :id, :stage_id, :subject_id 

    has_one :subject 
end 

Ich weiß nicht wirklich wie has_one Aufruf während es tatsächlich ein belongs_to Vereinigung ist:/

EDIT: Disregard mein Kommentar über has_one/gehört zu Mehrdeutigkeit, das Dokument ist eigentlich ziemlich klar darüber: http://www.rubydoc.info/github/rails-api/active_model_serializers/frames

+4

Okay, ja, das funktioniert. Ich glaube, ich verstehe die 'has_one' Methode jetzt besser. In einem 'Serializer' ist nur interessant, ob eine Methode ein oder mehrere Objekte zurückgibt. Eine Unterscheidung zwischen has_one und soars_to ist nicht interessant. Es ist ein bisschen suboptimal, dass der Wortlaut mit der ActiveRecord-Terminologie übereinstimmt, da die Begriffe nicht dasselbe bedeuten. – Jesper

+0

Ich stieß gerade vor kurzem auf dasselbe Problem. Ja, das Attribut has_one: funktioniert für mich. –

+11

Die Dokumentation für 'ActiveModel :: Serializer' gibt ausdrücklich an:" Serialisierer befassen sich nur mit der Multiplizität und nicht mit dem Besitz. Zu ActiveRecord-Zuordnungen können Sie mit has_one in Ihrem Serializer hinzufügen. " – awendt

3

Was ist, wenn Sie mit etwas li versuchen diese ke:

class UserCombinationSerializer < ActiveModel::Serializer 
    attributes :subject, 
      :stage, 
      :id 

    def subject 
    SubjectSerializer.new(object.subject, { root: false }) 
    end 

    def stage 
    StageSerializer.new(object.stage, { root: false }) 
    end 
end 
0

in Active Modell Serializer 0-10-stabil, belongs_to ist jetzt verfügbar.

belongs_to :author, serializer: AuthorPreviewSerializer 
belongs_to :author, key: :writer 
belongs_to :post 
belongs_to :blog 
def blog 
    Blog.new(id: 999, name: 'Custom blog') 
end 

https://github.com/rails-api/active_model_serializers/blob/0-10-stable/docs/general/serializers.md#belongs_to

So könnten Sie tun:

class UserCombinationSerializer < ActiveModel::Serializer 
    attributes :id 
    belongs_to :stage, serializer: StageSerializer 
    belongs_to :subject, serializer: SubjectSerializer 
end 
Verwandte Themen