On Fri, Aug 6, 2021 at 1:09 PM [email protected] <[email protected]> wrote:

> I'm trying to restrict the number of JSON fields that are returned by a
> Sinatra app's endpoint.
>
> The model:
>
> class FooBar< Sequel::Model
>     plugin :json_serializer
>    ...
> end
>
> If I filter the model using a WHERE statement, which returns an array, the
> fields aren't restricted:
>
>     @results = FooBar
>
>     if params[:a] # => 'foo'
>         @results = @results.where( a: params[:a] )
>     end
>

Just FYI, this is a bad idea from a security perspective.  You should make
sure the result of params[:a] is the expected type (typecast/raise if not).

In general, it's best to handle your requirement by selecting only the
columns you need:

  @results = @results.select(:a, :b)

Then you don't need to use options to to_json.


>     @results.all.to_json(only: [:a,:b])
>

This calls Array#to_json, not Sequel::Dataset#to_json.  You should not
expect Array#to_json to support the same options as Sequel::Dataset#to_json.

You could switch to:

@results.to_json(only: [:a, :b])

However, the approach using Sequel::Dataset#select ,as shown above, is
better, unless you will be needing the columns for some other reason.


>
>     {
>         "a": "foo",
>         "b": "bar",
>         "c": "baz",
>         "d": "xxx"
>     }
>
>           I've also tried @results.naked.to_json() with the same results.
>
> If I select using the primary key, however, the columns are restricted:


This calls Sequel::Model#to_json, which supports the :only option.


>
>     FooBar['foo'].to_json(only: [:a,:b])
>
>     {
>         "a": "foo",
>         "b": "bar"
>     }
>
> Are arrays of instances supported?
>

They are.  In general, if you are creating the JSON from a dataset, call
#to_json on the dataset, instead of calling #all to return an array on
instances, and then calling #to_json on that.  However, you can call the
class method (Sequel::Model.to_json) with an :array option if you have an
existing array of model instances:

FooBar.to_json(array: @results.all, only: [:a, :b])

Thanks,
Jeremy

-- 
You received this message because you are subscribed to the Google Groups 
"sequel-talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sequel-talk/CADGZSSeGBAkfx7rLg81MqQs6Zuq_OE_-5Wm0nPxu1DezgKyfKg%40mail.gmail.com.

Reply via email to