2015-10-21 6 views
1

Я пытаюсь динамически определять сериалайзер, основанный на свойстве модели (в пределах родительского сериализатора):Динамически задание сериалайзера, основанный на свойстве модели

ActiveModel::Serializer.setup do |config| 
    config.embed = :ids 
    config.embed_in_root = true 
end 

class DocumentSerializer < ActiveModel::Serializer 

    attributes :id, :name, :document_layout 

    if attributes[:document_layout] === 'portrait' 
    has_many :pages, serializer: PortraitPageSerializer 
    elsif attributes[:document_layout] === 'landscape' 
    has_many :pages, serializer: LandscapePageSerializer 
    end 

end 

, но это не кажется работать (я считаю, что атрибуты - это не просто хэш).

Есть ли другой способ получить доступ к стоимости? Или я об этом совершенно неправильно?

+0

Как вы выбрали DocumentSerializer? Вы только что сделали документ? – Swards

+0

Yep в моем контроллере Я звоню: render json: @documents, status: ok –

+0

Возможно, было бы разумнее использовать один и тот же сериализатор и просто оставить его пустым в зависимости от document_layout –

ответ

1

Думал об этом больше (прошло некоторое время с тех пор, как я работал над сериализаторами), будет ли это работать?

class DocumentSerializer < ActiveModel::Serializer 

    attributes :id, :name 
    has_many :portrait_pages, key: pages, serializer: PortraitPageSerializer 
    has_many :landscape_pages, key: pages, serializer: LandscapePageSerializer 

    def portrait_pages 
    pages if object.document_layout === 'portrait' 
    end 

    def landscape_pages 
    pages if object.document_layout === 'landscape' 
    end 

end 

Другой вариант здесь - подкласс вашего документа, чтобы иметь документ LandscapeDocument и PortraitDocument. Это может быть основано на типе, который совпадает с вашим полем document_layout. Мысль ...

+0

Hi Swards, я думаю, что вы правы ... Rails STI - это, вероятно, путь вперед, поскольку все они могут наследовать базовый класс, но тогда у меня могут быть отдельные сериализаторы для каждого типа –

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