0

AMS версии 0.8.3,нагрузки ассоциации к одному уровню, условно sideloading ассоциации в активной модели сериализаторов

Я создал base_serializer.rb, как это и распространяется то же самое.

class BaseSerializer < ActiveModel::Serializer 
    def include_associations! 
    if @options[:embed] 
     embed = @options[:embed].split(',').map{|item| item.strip.to_sym} 
     embed.each do |assoc| 
     include! assoc if _associations.keys.include?(assoc) 
     end 
    end 
    end 
end 

class EventSerializer < BaseSerializer 
    attributes :id, :name 
    has_many :organizers, serializer: OrganizerSerializer 
    has_many :participants, serializer: ParticipantSerializer 
end 

class OrganizerSerializer < BaseSerializer 
    attributes :id, :name 
    has_many :related, serializer: RelatedSerializer 
end 

class ParticipantSerializer < BaseSerializer 
    attributes :id, :name 
    has_many :related, serializer: RelatedSerializer 
end 

class RelatedSerializer < BaseSerializer 
    attributes :id, :name 
    has_many :something, serializer: SomethingSerializer 
end 

и индексный метод в EventsController записывается как

# GET /events?embed=organizers,participants 
    def index 
     @events = Event.all 
     render json: @events, embed: params[:embed] 
    end 

С этим я могу получить: Удостоверение личности и: название мероприятия, организаторов и участников. Но, я хочу также атрибуты связанной ассоциации. Мне не нужны детали сериализатора. Я хочу идти до этого уровня для каждой ассоциации. Как я могу это достичь?

ответ

0

Я в конечном итоге сделал это, чтобы достичь того же.

class BaseSerializer < ActiveModel::Serializer 
    def include_associations! 
    @options[:embed_level] ||= 2 
    return unless @options.key?(:embed) && @options[:embed_level] != 0 
    embed = @options[:embed].split(',').map{|item| item.strip.to_sym} 
    embed.each do |assoc| 
     next unless _associations.key?(assoc) 
     assoc_serializer = serializer_for(assoc) 
     embed = @options[:embed] 
     embed_level = @options[:embed_level] 
     @options[:embed_level] = @options[:embed_level] - 1 
     @options[:embed] = assoc_serializer._associations.keys.join(",") 
     include! assoc 
     @options[:embed_level] = embed_level 
    end 
    end 

    def serializer_for(assoc) 
    serializer = _associations[assoc].options[:serializer] 
    return serializer if serializer 
    assoc.to_s.classify.concat("Serializer").constantize 
    end 
end 

Ref: Github Issue Link Особая благодарность Роберту Yohan !!!

Смежные вопросы