Programmierung

Mar 23, 2021

Einführung von JSOM-Pagination - ein eigenständiges Paginierungs-Gem

Einführung von JSOM-Pagination - ein eigenständiges Paginierungs-Gem

Einführung von JSOM-Pagination - ein eigenständiges Paginierungs-Gem

Sebastian Wilgosz

Ruby-Entwickler

Ruby-Paginierung einfach gemacht: JSOM-pagination behebt die Schwächen von Pagy, Kaminari und Will_Paginate.

Ich habe das Vergnügen, Ihnen einen neuen Edelstein vorzustellen, der zur Unterstützung einer JSON:API-basierten Webanwendung erstellt wurde. Eigenständige Paginierungsunterstützung.

Warum noch ein Paginierungs-Gem?

Tja, ich weiß, was Sie jetzt denken - WARUM habe ich mir die Mühe gemacht, ein weiteres Paginierungs-Gem zu bauen? Es gibt viele Paginierungs-Plugins für Ruby-Webanwendungen, um nur ein paar beliebte zu nennen:

The ersten beiden sind "kaminari" und "will_paginate". Beide sind eng mit ActiveRecord verbunden, was je nach Bedarf gut oder schlecht sein kann. Sicherlich ist die Implementierung einer der oben genannten extrem einfach, da sie einfach Ihre Modelle erweitern!

Sie haben jedoch zwei große Probleme.

  1. It's super schwer, sie aus den ActiveRecord-basierten Sammlungen zu verwenden.

  2. They are slow.

Fortunately, schlaue Leute da draußen bereits beide dieser Probleme angegangen und haben Pagy.

Pagy ist ein viel attraktiveres Schmuckstück, da es'dutzende Male schneller ist als jede der oben aufgeführten Lösungen und wirklich framework-agnostisch. Es kann in allen Rack-Anwendungen verwendet werden und ich verwende es (direkt oder indirekt) in allen meinen Projekten, egal mit welchem Framework ich spiele.

Es hat jedoch auch mindestens 2 Probleme, die ich für wichtig halte.

1. Die architektonischen Mängel

Das erste der Probleme, mit denen ich konfrontiert wurde, ist, dass Pagy basiert auf Modulen und einer Menge assumptions, die den Benutzer dazu zwingen, viele Konfigurationen vorzunehmen, wenn er den Edelstein außerhalb von Rails-basierten Standard-Controllern verwenden möchte.

Zum Beispiel nimmt pagy an, dass es eine params Methode gibt, die in der Klasse zugänglich ist, in der man den Pagy einbindet::Backend module. Wenn wir Metadaten und zugehörige Link-Informationen hinzufügen wollen, benötigen wir eine Erweiterung, die ebenfalls eingebunden werden muss, aber diese setzt voraus, dass wir eine request Methode zugänglich haben!

All das ist kein Problem, wenn wir es innerhalb von Rails

Sagen wir, wir wollen ein Query Objekt haben, das die Datensätze aus der Datenbank auswählt und das paginierte Ergebnis liefert. Oder eine Endpoint Instanz, wo man gerne als Ergebnis eine bereits serialisierte und paginierte Antwort erhalten würde. Anstatt die Abhängigkeiten wie eine request-Instanz in das Pagy-Objekt zu injizieren, müssen wir Methoden in der Aufruferklasse definieren.

Dies ist ein schwerwiegender Fehler in der Architektur, da der Aufrufer umfassende Kenntnisse darüber haben muss, wie der Paginator Ressourcen paginiert. Außerdem zwingt die vom Aufrufer verwendete Paginierungs-Engine dem Aufrufer die spezifische Implementierung auf, was es sehr schwer macht, sie in der Zukunft zu ersetzen, wenn ein Bedarf dafür besteht.

I{ENTITY_228}}m bin mir nicht sicher, warum es auf diese Weise entworfen wurde, wo die Paginierungssteuerung auf überschriebenen Methoden und globalem Status basiert, aber es{ENTITY_229}}ist unnötige Komplexität und eine Menge Probleme, die ohne Notwendigkeit eingeführt wurden. Es gibt einen viel einfacheren Weg.

The JSON:API-Unterstützung

{

Das andere Problem ist, dass, da dieser Edelstein so Framework-agnostisch ist, es immer ein bisschen Code gibt, den man schreiben muss, um ihn mit dem JSON:API-Standard kompatibel zu machen und nicht nur dafür. Zum Beispiel nimmt pagy standardmäßig an, dass Sie page und per_page Parameter haben und stürzt bei benutzerdefinierten Paginierungsparametern ab. Da JSON:API vorschlägt, die Paginierung über einen verschachtelten Query-Parameter page[size] und page[number] zu steuern, muss das pagy gem angepasst werden, um es effektiv zu nutzen.

Da ich täglich mit mehreren Projekten arbeite, wäre es wirklich mühsam, das immer wieder zu wiederholen.

The JSOM:Paginierung

Um die beiden oben genannten Probleme zu lösen, Habe ich mich entschlossen, einen kleinen Wrapper um pagy{ zu schreiben, um eine bequeme Erfahrung für jede JSON-API-kompatible App zu bieten - und habe ihn benannt: jsom-pagination.

JSOM:Pagination ist eine einfache Klasse, die wir an jeder Stelle der Anwendung (nicht nur in den Controllern!) - und in jeder Art von Ruby-Anwendung. Sie brauchen keine zusätzliche Konfiguration, Sie brauchen keine verschiedenen Module, um es in Rails oder Hanami oder in einer IRB-Session zu verwenden!

Hier sind zwei Beispiele, wie Sie es in Ihrer App verwenden können.

Zuerst müssen Sie instanziieren. die Instanz eines Paginators

Und um ein Array zu paginieren, muss man es nur mit einer Collection, einem Parameter-Hash und dem Basis-URL-Wert aufrufen - um die zugehörigen Paginierungs-Links zu generieren, wie z.B. next, last, usw.

In Rails controllers and ActiveRecord collection, würde es wie folgt aussehen:

So, und was ist das Coole daran?

Es mag auf den ersten Blick nicht beeindruckend aussehen, aber die Injektion der Abhängigkeiten in den Paginator ermöglicht es uns, die Paginierung überall einfach auszuführen. Außerdem ist die JSON:API-Unterstützung eingebaut.

Alle Meta-Informationen sind sofort zugänglich:

Das Gleiche gilt für Links zu den verwandten Seiten.

And that's all.

Serializing the paginated collection

jsom-pagination zwingt Sie nicht dazu, eine bestimmte Serialisierungsmethode zu verwenden, um diese Daten zurückzugeben. Sie können jede beliebige Methode zur Serialisierung des Ergebnisses verwenden. Wenn Sie beispielsweise jsonapi-serializer, hier ist, wie man es macht

Etwas extra für Rails-Benutzer

Speziell für Rails-Benutzer, Habe ich ein einfaches Concern geschrieben, in dem wir alle paginierungsbezogenen Methoden sammeln können, um die Nutzung so weit wie möglich zu vereinfachen.

Damit können wir die render_collection Methode verwenden, um die Sammlung unter der Haube zu serialisieren:

Nun weiß der Controller fast nichts darüber, wie man Sammlungen paginiert, und wir können diese Funktion ganz einfach überall nutzen, wo wir wollen, und unsere Klassen schlank und einfach zu verwalten halten.

Es ist eine enorme Verbesserung und ich hoffe, es hat Ihnen bis jetzt gefallen!

Zusammenfassung

Das Schreiben von nützlichen Edelsteinen ist keine triviale Sache. Aber in der Ruby-Welt sehe ich, dass die Dinge oft zu kompliziert sind und zu viel voraussetzen. Es ist überraschend, dass ein so einfaches Problem wie die Paginierung so viele Probleme bei der Implementierung und Verwendung der vorgeschlagenen Lösungen erzeugt.

I hope that jsom-pagination Ihnen helfen wird, sie zu umgehen!

Melde dich bei mir auf Twitter, was Sie davon halten!

✍️

ABOUT THE AUTHOR

Sebastian Wilgosz

Ruby-Entwickler

Ruby-Enthusiast, Kaffeeliebhaber und Produktivitätsfanatiker. Ich liebe es, kreative Wege zu finden, um alles, was ich tue, zu verbessern.

Sie haben eine Projektidee? Lassen Sie uns darüber reden und sie zum Leben erwecken

Ihre hochqualifizierten Spezialisten sind da. Nehmen Sie Kontakt auf, um zu sehen, was wir gemeinsam tun können.

Dariusz Michalski

Dariusz Michalski, CEO

dariusz@useo.pl

Konrad Pochodaj

Konrad Pochodaj, CGO

konrad@useo.pl

Sie haben eine Projektidee? Lassen Sie uns darüber reden und sie zum Leben erwecken

Ihre hochqualifizierten Spezialisten sind da. Nehmen Sie Kontakt auf, um zu sehen, was wir gemeinsam tun können.

Dariusz Michalski

Dariusz Michalski, CEO

dariusz@useo.pl

Konrad Pochodaj

Konrad Pochodaj, CGO

konrad@useo.pl

Sie haben eine Projektidee? Lassen Sie uns darüber reden und sie zum Leben erwecken

Ihre hochqualifizierten Spezialisten sind da. Nehmen Sie Kontakt auf, um zu sehen, was wir gemeinsam tun können.

©2009 - 2025 Useo sp. z o.o.