2012-10-29 16 views
23

To pytanie dotyczy AMS 0,8Aktywni Serializers model belongs_to

Mam dwa modele:

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 

i dwa serializers:

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 

Kiedy UserCombination jest seryjny, Chcę osadzić całe poddrzewo obiektów.

Kiedy próbuję użyć tej konfiguracji otrzymuję ten błąd:

undefined method `belongs_to' for UserCombinationSerializer:Class 

Próbowałem zmieniając UserCombinationSerializer do tego:

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

W tym przypadku otrzymuję żadnych błędów, ale subject jest serializowane w niewłaściwy sposób - nie używając SubjectSerializer.

Moje pytania:

  1. nie powinienem być w stanie korzystać z relacji belongs_to w serializatora?
  2. Jeśli nie - jak uzyskać pożądane zachowanie - osadzenie drzewa tematów przy użyciu obiektu SubjectSerializer?

Odpowiedz

37

To naprawdę nie jest eleganckie, ale wydaje się działać:

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

    has_one :subject 
end 

ja nie lubię nazywając has_one natomiast to faktycznie stowarzyszenie belongs_to:/

EDIT: Lekceważenie mój komentarz o has_one/belongs_to dwuznaczności, doc jest w zasadzie całkiem jasny: http://www.rubydoc.info/github/rails-api/active_model_serializers/frames

+4

Ok, tak, to działa. Myślę, że teraz lepiej rozumiem metodę 'has_one'. W 'Serializatorze', jedyną ciekawostką jest to, czy metoda zwraca jeden lub wiele obiektów. Zatem rozróżnianie między has_one i belongs_to nie jest interesujące. Jest to trochę suboptymalne, że sformułowanie pokrywa się z terminologią ActiveRecord, ponieważ terminy nie oznaczają tego samego. – Jesper

+0

Wpadłem ostatnio na ten sam problem. Tak, użycie atrybutu has_one: działa dla mnie. –

+11

Dokumentacja dla "ActiveModel :: Serializer" wyraźnie stwierdza: "Serializatory dotyczą tylko mnogości, a nie własności. Belongs_to Asocjacje ActiveRecord mogą być zawarte za pomocą has_one w serializatorze." – awendt

3

Co jeśli spróbujesz z czymś ke to:

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

W modelu aktywnego serializer 0-10-stabilny, belongs_to jest już dostępna.

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

Więc można zrobić:

class UserCombinationSerializer < ActiveModel::Serializer 
    attributes :id 
    belongs_to :stage, serializer: StageSerializer 
    belongs_to :subject, serializer: SubjectSerializer 
end 
Powiązane problemy