Zum Beispiel haben Sie eine Liste von Elementen, sortiert nach Priorität. Sie haben 10.000 Artikel! Wenn Sie dem Benutzer einen einzelnen Artikel zeigen, wie stellen Sie Schaltflächen bereit, damit der Benutzer den vorherigen Artikel oder den nächsten Artikel sehen kann (was sind diese Artikel)?
Sie könnten die Position des Elements an die Artikelseite übergeben und OFFSET in Ihrer SQL-Abfrage verwenden. Der Nachteil davon ist, dass die Datenbank nicht zum Offset springen kann, außer dass sie eine Zahl übergeben muss, die sich ändern kann. es muss jeden Datensatz lesen, bis es zum Beispiel den 9001. Datensatz erreicht. Das ist langsam. Nachdem ich nach einer Lösung gesucht hatte, konnte ich keine finden, also schrieb ich order_query .
order_query verwendet die gleiche ORDER BY-Abfrage, enthält aber auch eine WHERE-Klausel, die Datensätze vor (für die nächste) oder danach ausschließt ( für prev) die aktuelle.
Hier ist ein Beispiel dafür, wie die Kriterien aussehen könnten (mit dem obigen Juwel):
%Vor%Habe ich das Rad hier einfach neu erfunden? Ich bin sehr an anderen Ansätzen interessiert, dies im Backend zu tun.
Intern erstellt dieses Juwel eine Abfrage, die von den Bestellwerten des aktuellen Datensatzes abhängt und wie folgt aussieht:
%Vor% Dabei steht x
für >
/ <
terms und y
für =
terms (für die Auflösung von Bindungen) pro Bestellkriterium.
Beispielabfrage aus dem Protokoll der Testsuite:
%Vor%Ich habe einen alternativen Ansatz gefunden und verwendet ein Konstrukt aus dem SQL '92 Standard (Prädikate 209), das Vergleichsvergleichselement für den Zeilenwertkonstruktor:
Seien Rx und Ry die zwei Zeilenwertkonstruktoren des Vergleichsprädikats und RXi und RYi sind die i-ten Zeilenwertkonstruktorelemente von Rx bzw. Ry. "Rx comp op Ry" ist wie folgt wahr, falsch oder unbekannt:
- "x = Ry" ist genau dann wahr, wenn RXi = RYi für alle i.
- "x & lt; & gt; Ry" ist wahr, wenn und nur wenn RXi & lt; & gt; RYi für einige i.
- "x & lt; Ry" ist wahr, wenn und nur wenn RXi = RYi für alle i & lt; n und Rxn & lt; RYn für einige n.
- "x & gt; Ry" ist wahr, wenn und nur wenn RXi = RYi für alle i & lt; n und Rxn & gt; RYn für einige n.
Ich fand ein Beispiel in diesem Artikel von Markus Winand . Vergleichsvergleichselement für Zeilenwertkonstruktoren kann wie folgt verwendet werden:
%Vor%Dies entspricht ungefähr dieser Abfrage:
%Vor%Die erste Einschränkung besteht darin, dass zur direkten Verwendung alle Auftragskomponenten in die gleiche Richtung weisen müssen, da sonst mehr Fiedeln erforderlich ist. Der andere Grund ist, dass Zeilenvergleichsprädikate trotz ihrer Standardisierung von den meisten Datenbanken nicht unterstützt werden (funktioniert bei Postgres).
Tags und Links ruby ruby-on-rails activerecord