Как иметь 2 разных сериализатора для моделей STI в Fast Json Api или Active Model Serializer - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть модель workflow и 2 типа рабочих процессов

  1. normal_workflow
  2. special_workflow

Существует модель project, котораясвязанные с моделью рабочего процесса с использованием has_many/belongs_to ассоциации.

Теперь для получения всех рабочих процессов проекта у нас есть WorkflowsController.

Я хотел вернуть массив рабочих процессов (которыйсюда входят 2 записи: одна для normal_workflow и другая для special_workflow) со следующими требованиями:

  1. NormalWorkflow должен отображать только подмножество всех полей Workflow с некоторой метаинформацией.
  2. SpecialWorkflow должен показывать другое подмножество полей Workflow с некоторой мета.

Один из способов достижения этого - проверитьtype из workflow для каждого атрибута и отношения.Я думаю, что этот подход не очень хорош, потому что когда тип рабочего процесса увеличивается, условия в сериализаторе также увеличиваются.

class Project
    has_many :workflows
    has_many :normal_workflows
    has_many :special_workflows
end

class Workflow < ApplicationRecord
    belongs_to :project
end

class NormalWorkflow < Workflow
    # STI model
    belongs_to :project
end

class SpecialWorkflow < Workflow
    # STI model
    belongs_to :project
end

class WorkflowsController < ApplicationController
    # Using fast-json-api gem
    def index
        @workflows = WorkflowSerializer.new(@project.workflows).serialize_json
    end
end

Итак, я ищу более чистое решение, которое поможет сохранитькод сухой, а также расширяемый бит для других типов.(Это может быть использование некоторых декораторов или любого другого объекта)

...