cache-crispies icon indicating copy to clipboard operation
cache-crispies copied to clipboard

Ability To Provide Options Alongside Nested Serializes

Open Seacant opened this issue 3 years ago • 3 comments

When using nested serializers (serialize :thing, with: ThingSerializer), handling all the options that need to be passed in at the top level can quickly become tedious and prone to mistakes. It would be helpful if we could specify options alongside the nested attribute.

class ThingSerializer < CacheCrispies::Base
  ...

  # top-level options overrides what we specify here
  serialize :thing, with: ThingSerializer, with_options: { 
    | model, options |  ({
      foo: true,
      bar: get_default_bar_for(model),
      baz: !options[:anti_baz],
      **options
    })
  }

  # these options are forced overrides no matter what is passed in up top
  serialize :other_thing: with: OtherSerializer, with_options: {
    | model, options | ({
      **options,
      foo_author: model.foo.author
    })
  }

Seacant avatar Dec 20 '21 15:12 Seacant

We would also want this feature, But I find this a bit over-engineered.

If it depends on the model, or the existing options, you can use a custom defined function already. But for adding a simple option, having to define a custom function seems overkill.

So we would prefer something like this, where the existing options just get augmented with default new options

class ThingSerializer < CacheCrispies::Base
  serialize :thing, with: ThingSerializer, with_options: {
      foo: true,
      bar: "baz",
    }
end

It's especially useful to serialize a common object (i.e. a user), that has an option to switch between a basic and a full serializer.

sander-deryckere avatar Jun 01 '22 08:06 sander-deryckere

Any update on this? we would find it useful too.

kyleyardlink avatar Aug 08 '22 16:08 kyleyardlink

Sorry for sitting on this one for so long. I remember reading it earlier, but for some reason didn't comment.

This makes sense to me. Although, I'm not sure I'm 100% happy with either approach. If I have time I'll try to poke around a bit in the code and see what I can come up with.

adamcrown avatar Dec 17 '22 23:12 adamcrown