I would probably do this with a different endpoint for everyone, but you could also pass a different url parameter or something like that. Generally, I think you would like the default to be more limited.
Here is how I would suggest:
controller
Different endpoints for everyone
render json: objects, each_serializer: WeatherLogAllSerializer
Allow custom fields
fields = params[:fields]
Three different serializers: all, default, custom
Everything
class WeatherLogAllSerializer < ActiveModel::Serializer attributes :id, :temperature, :precipitation, :precipitation has_many :measurements def temperature "Celsius:
Default
class WeatherLogSerializer < ActiveModel::Serializer attributes :id, :temperature def temperature "Celsius:
Custom
class WeatherLogCustomSerializer < WeatherLogSerializer def attributes data = super if scope scope.split(",").each do |field| if field == 'precipitation' data[:precipitation] = object.precipitation elsif field == 'humidity' data[:humidity] = object.humidity elsif field == 'measurements' data[:measurements] = ActiveModel::ArraySerializer.new(object.measurements) end end end data end end
source share