У меня есть модель workflow
и 2 типа рабочих процессов
- normal_workflow
- special_workflow
Существует модель project
, котораясвязанные с моделью рабочего процесса с использованием has_many/belongs_to
ассоциации.
Теперь для получения всех рабочих процессов проекта у нас есть WorkflowsController
.
Я хотел вернуть массив рабочих процессов (которыйсюда входят 2 записи: одна для normal_workflow
и другая для special_workflow
) со следующими требованиями:
NormalWorkflow
должен отображать только подмножество всех полей Workflow
с некоторой метаинформацией. 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
Итак, я ищу более чистое решение, которое поможет сохранитькод сухой, а также расширяемый бит для других типов.(Это может быть использование некоторых декораторов или любого другого объекта)