Rails Grape API与AMS和自定义JSON分页

时间:2016-06-05 21:39:09

标签: ruby-on-rails pagination kaminari active-model-serializers grape

在Rails中做什么可能需要更复杂/创造性的解决方案,但基本上使用Grape,active_model_serializers(AMS)和grape-kaminari来返回User对象的索引路径(列表),我希望能够使用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: "daniel@archer.co",
      username: "dja"
     },
    {
      id: 2,
      firstname: "Fakey",
      lastname: "McFakerson,
      email: "fake@fake.io",
      username: "fake"
     }
  ],
  extras: {
    user_count: 300,
    new_users_last_5_days: 10,
    new_users_last_30_days: 25
  }
}

我想要发生的事情(并且遇到问题)是对JSON响应中的用户数量进行分页,但包括一些与整个用户集相关的额外内容。例如,我可能有300个用户,但我只想返回前18个用户(或多个基于参数per_pagepage),以及整个集合的额外数据。

1 个答案:

答案 0 :(得分:0)

使用Grape :: Entity,您可以呈现多个值。

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

使用vanilla Grape,返回一个数据结构,该结构根据输出格式进行转换,即使用.to_json。所以你可以返回一个哈希:

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