fotinakis / jsonapi-serializers

Pure Ruby readonly serializers for the JSON:API spec.
MIT License
414 stars 91 forks source link

Possible to specify serializer to use for relationship of different name? #134

Open mecampbellsoup opened 4 years ago

mecampbellsoup commented 4 years ago

I have a JobSerializer that has 2 relationships - the hosted file, and outputs.

(This is because a job is rendered from a file that the user uploaded - the "hosted file" - and the result of running the job are output files - "outputs".)

Both the singular hosted file, and the plural output, relationships are modeled by a class called HostedFile (not backed by ActiveRecord, but rather backed by the filesystem).

I want to use the same serializer for both relationships, i.e. API::V1::HostedFileSerializer.

Is it possible to specify the serializer to use for a relationship, e.g.:

class API::V1::JobSerializer < API::V1::BaseSerializer
  include JSONAPI::Serializer

  has_one :hosted_file
  has_many :outputs, serializer: API::V1::HostedFileSerializer

Ideally I could then do something like the following and both relationships would be serialized using the API::V1::HostedFileSerializer:

class JobsController < ApplicationController
  def show
    serialize_model job, include: ['outputs', 'hosted-file']
  end
end
mecampbellsoup commented 4 years ago

BTW, I tried doing the following as well:

# Added to bottom of `api/v1/hosted_file_serializer.rb` file
API::V1::OutputSerializer = API::V1::HostedFileSerializer
digaoddc commented 4 years ago

I agree, It'd be great to specify the serializer in the method has_many and has_one.

like this:

has_one :foo, serializer API::V1::Foo
has_many :bar, serializer: API::V1::Bar
mecampbellsoup commented 4 years ago

FWIW, I ended up defining Job#outputs to return an array of HostedFile instances, and this library seems to look at the type/class of the relationship... long story short, my JobSerializer#outputs relationship is correctly serialized using my HostedFileSerializer.