在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_page
和page
),以及整个集合的额外数据。
答案 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