Сериализация только указанных атрибутов c с ActiveModel и Grape API в зависимости от действия - PullRequest
0 голосов
/ 13 апреля 2020

В моем Grape API к одной и той же модели могут обращаться разные контроллеры и конечные точки. Мне нужно сериализовать одну и ту же модель для каждого из них, но не каждый атрибут применяется ко всем конечным точкам. Я знаю, что есть метод «фильтра», но это удаляет атрибут. Я хотел бы перечислить действительные атрибуты вместо этого. Это кажется безопаснее. Я разобрался в следующем подходе. Однако есть ли встроенный способ, который мне не хватает?

Используя приведенный ниже код, я хотел бы вернуть "id, comments, status, user_id", если он вызывается конечной точкой "/ event_signups". Я хотел бы вернуть "id, comments, event_id", если он вызывается конечной точкой "/ user_signups".

Сериализатор

module Mobile
  module V4

    class SignupSerializer < ActiveModel::Serializer

      attributes :id,
                 :comments,
                 :status,
                 :event_id,
                 :user_id

      attribute :id,       if: :id?
      attribute :comments, if: :comments?
      attribute :status,   if: :status?
      attribute :event_id, if: :event_id?
      attribute :user_id,  if: :user_id?

      def id?
        !instance_options[:allowed_attributes].index(:id).nil?
      end

      def comments?
        !instance_options[:allowed_attributes].index(:comments).nil?
      end

      def status?
        !instance_options[:allowed_attributes].index(:status).nil?
      end

      def event_id?
        !instance_options[:allowed_attributes].index(:event_id).nil?
      end

      def user_id?
        !instance_options[:allowed_attributes].index(:user_id).nil?
      end

    end

  end
end

Конечные точки API Grape

module Mobile
  module V4
    class Signups < Mobile::V4::Root
      include Mobile::V4::Defaults

      resource :signups, desc: 'Operations about the signups' do

        desc 'Returns list of user's signups'
        oauth2 # This endpoint requires authentication

        get '/user_signups', allowed_attributes: [:id, :comments, :event_id] do
          Signup.where(user_id: current_user.id)
        end

        desc 'Returns list of event's signups'
        params do
          requires :event_id, type: Integer, desc: 'Event ID'
        end
        oauth2 # This endpoint requires authentication

        get '/event_signups', allowed_attributes: [:id, :comments, :status, :user_id] do
          Signup.where(event_id: params[:event_id])
        end

      end

    end

  end
end

1 Ответ

0 голосов
/ 14 апреля 2020

Можете ли вы попробовать выбрать только те поля, которые вам нужны? Например,

Signup.where(user_id: current_user.id).select(:id, :comments, :status, :user_id)
...