0

Doing in Rails, was eine komplexere/kreative Lösung erfordern, aber grundsätzlich Grape, active_model_serializers (AMS) und traube-Kaminari, um eine Indexroute (Liste) von User-Objekten , und ich möchte die Vorteile von AMS beim Caching und einfachen Serialisieren von Objekten nutzen, aber die JSON-Antwort anpassen.Rails Grape API Seitenumbruch mit AMS und benutzerdefinierten JSON

Hier Rebsorte:

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 

Und AMS:

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

Ideal Antwort in 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 
    } 
} 

Was ich passieren möchte (und mit Mühe haben) ist um die Anzahl der Benutzer in der JSON-Antwort zu paginieren, aber einige Extras, die sich auf die gesamte Benutzergruppe beziehen. Zum Beispiel kann ich 300 Benutzer haben, aber ich möchte nur die ersten 18 Benutzer (oder wie viele basierend auf den Parametern per_page und page) und zusätzliche Daten für die gesamte Sammlung zurückgeben.

Antwort

0

Mit Grape :: Entity können Sie präsentieren mehrere Werte.

paginate users 

präsentiert nur die ausgewählte Seite der Benutzer. Sie können einen anderen vorhanden kurz danach hinzu:

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

Ihren Kommentar Antwort:
Ich verwende ein ähnliches Setup und haben eine Antwort, die mit kaminary und erweitert mit zusätzlichen Daten paginierte ist:

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 

Mit Vanille Grape wird eine Datenstruktur zurückgegeben, die abhängig vom Ausgabeformat, also mit konvertiert wird. So können Sie einen Hash zurück:

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

Sie sind also sagen, fügen Sie einfach 'vorhanden: Extras, {USER_COUNT: User.count, ...}' auf einer Linie nach 'Paginieren Benutzer'? Das scheint bei mir nicht zu funktionieren. –

+0

Oder erfordert das die Verwendung von Grape-Entity? –

+0

Ich benutze es mit und ohne Grape-Entity. –