0

Выполнение в Rails, что может потребовать более сложного/творческого решения, но в основном с использованием Grape, active_model_serializers (AMS) и grape-kaminari для возврата указательного маршрута (списка) объектов пользователя , и я хотел бы иметь возможность использовать преимущества AMS с кешированием и легко сериализовать объекты, но настроить ответ JSON.Rails Grape API pagination с AMS и пользовательским JSON

Вот винограда:

module API 
    module V1 
    class Users < Grape::API 
     include API::V1::Defaults 
     include Grape::Kaminari 

     resource :users do 
     paginate per_page: 18 
     get do 
      users = User.all 
      paginate users 
     end 
     end 
    end 
    end 
end 

И AMS:

class UserSerializer < ActiveModel::Serializer 
    cache key: 'user', expires_in: 3.hours 
    attributes :id, :firstname, :lastname, :email, :username 
end 

Идеальный ответ в формате JSON:

{ 
    users: [ 
    { 
     id: 1, 
     firstname: "Daniel", 
     lastname: "Archer, 
     email: "[email protected]", 
     username: "dja" 
    }, 
    { 
     id: 2, 
     firstname: "Fakey", 
     lastname: "McFakerson, 
     email: "[email protected]", 
     username: "fake" 
    } 
    ], 
    extras: { 
    user_count: 300, 
    new_users_last_5_days: 10, 
    new_users_last_30_days: 25 
    } 
} 

То, что я хотел бы произойти (и возникают проблемы с) является для разбивки количества пользователей в ответе JSON, но включают некоторые дополнительные функции, связанные со всей коллекцией пользователей. Например, у меня может быть 300 пользователей, но я хочу только вернуть первых 18 пользователей (или сколько их основано на параметрах per_page и page) и дополнительные данные по всей коллекции.

ответ

0

С виноградом :: Сущность вы можете настоящее время несколько значений.

paginate users 

представляет только избранную страницу пользователей. Вы можете добавить еще один настоящий только после этого:

present :extras, {user_count: User.count, ...} 

Чтобы ответить на ваш комментарий:
Я использую подобную установку и ответ, который разбивается на страницах с kaminary и протяженный с дополнительными данными:

get do 
    ... 
    present :statistics, statistics, with: API::Entities::Statistics 
    present :refresh_time, Setting.list_refresh_time 
    present :users, @users.page(params[:page]).per(18), with: API::Entities::User 
end 

С ванилью Grape возвращается структура данных, которая преобразуется в зависимости от выходного формата, то есть с .to_json. Таким образом, вы можете вернуть Hash:

get do 
    ... 
    { statistics: some_statistics, 
    users: @users.page(params[:page]).per(18) 
    } 
end 
+0

Так вы говорите, просто добавьте 'Присутствуют: статистов, {user_count: User.count, ...}' на строке после 'постраничной users'? Это не работает для меня. –

+0

Или это требует использования Grape-Entity? –

+0

Я использую его с и без Grape-Entity. –

 Смежные вопросы

  • Нет связанных вопросов^_^