Rails: Vorheriger und Nächster Datensatz von vorheriger Abfrage

8

Meine App enthält Fotos und Nutzer können nach Fotos suchen, die bestimmte Kriterien erfüllen. Nehmen wir an, ein Nutzer sucht nach Fotos nach Tags, und wir erhalten etwa Folgendes:

%Vor%

Nun wird @results eine Standard-ActiveRecord-Abfrage mit mehreren Datensätzen sein. Diese werden in einem Raster angezeigt, und ein Benutzer kann dann auf ein Foto klicken. Dies würde die Benutzer zur Aktion photos#show führen.

Nehmen wir also an, der Nutzer sucht nach etwas und die App findet 5 Datensätze, [1,2,3,4,5] , und der Nutzer klickt auf Foto # 3.

Auf der photo#show Seite möchte ich ein "Nächstes Foto", "Vorheriges Foto" und "Zurück zur Suche" anzeigen können.

Die einzige andere Einschränkung ist, wenn der Benutzer direkt zu einem Foto navigiert (über eine andere Seite oder ein Lesezeichen usw.), würde es kein logisches "nächstes" und "vorheriges" Foto geben, da keine Anfrage geführt wurde sie zu diesem Foto, in diesem Fall sollte die Vorlage den abfragebasierten Inhalt überhaupt nicht darstellen.

Also habe ich darüber nachgedacht, wie man so etwas macht, und ich habe nicht wirklich viele gute Ideen. Ich nehme an, ich könnte etwas tun, um die Abfrage in der Sitzung zu speichern, um zu ihr zurückkehren zu können, aber ich weiß nicht, wie ich die Fotos finden soll, die links und rechts neben dem ausgewählten Foto erscheinen.

>

Hat jemand Beispiele dafür, wie man so etwas macht?

    
Andrew 27.03.2011, 22:31
quelle

4 Antworten

11

Also, nach viel Versuch und Irrtum, hier ist, was ich gefunden habe:

In meinem Fotomodell:

%Vor%

Diese Methode gibt den nächsten und vorherigen Datensatz aus einer Suche oder einer bestimmten Ordneransicht zurück, indem sie ein Array dieser Datensatz-IDs akzeptiert. Ich erzeuge diese ID in jeder Controller-Ansicht, die eine Abfrageansicht erstellt (dh die Suchseite und die Seite zum Durchsuchen nach Ordnern):

So zum Beispiel enthält mein Search Controller:

%Vor%

Und dann enthält die photo # show action Folgendes:

%Vor%

Und schließlich enthält meine Ansicht:

%Vor%

Nun stellt sich heraus, dass dies in normalen Browsing-Situationen gut funktioniert - aber es gibt ein gotcha , das ich noch nicht behoben habe:

Wenn ein Benutzer theoretisch eine Ansicht durchsucht, springt er zu einem Foto, das in der Sitzung eine Abfrage generiert hat. Wenn sie aus irgendeinem Grund dann direkt (über URL oder Lesezeichen) zu einem anderen Foto navigieren, das Teil der vorherigen Abfrage war, wird die Abfrage in der Sitzung beibehalten, und die entsprechenden Fotos sind auf dem zweiten Foto noch sichtbar - obwohl Sie sollten nicht auf einem Foto sein, das jemand per Lesezeichen geladen hat.

In realen Anwendungsfällen war diese Situation jedoch ziemlich schwer nachzuvollziehen, und der Code funktioniert im Moment sehr gut. Irgendwann, wenn ich eine gute Lösung für das übrig gebliebene Problem gefunden habe, werde ich es posten, aber für den Moment, wenn jemand diese Idee benutzt, sei dir nur bewusst, dass es Möglichkeiten gibt.

    
Andrew 02.04.2011, 13:31
quelle
2

Andrew, Ihre Methode nicht universell und nicht garantierten richtigen Ergebnis. Es gibt einen besseren Weg, dies zu tun. In Ihrem Modell:

%Vor%

Und in Ansichten:

%Vor%     
jbmeerkat 29.02.2012 23:38
quelle
1

Ein Juwel, das ich geschrieben habe Nexter macht es für Sie.

Sie übergeben ihm eine AR-Scope-Kombination (aka ActiveRelation) plus das aktuelle Objekt / Record und Nexter prüft die Order-Klausel auf Erstellen Sie die SQL, die die Vorher / Zurück und Nachher / Nächste Datensätze abrufen wird.

Im Grunde betrachtet es die ActiveRelation # order_values ​​in der Reihenfolge (a, b, c) und kommt mit:

heraus %Vor%

Das ist nur der Kern davon. Es funktioniert auch mit Assoziationswerten und ist schlau beim Finden der inversen Werte für den vorherigen Teil. Um den Status Ihrer Suche (oder Bereichskombination) beizubehalten, können Sie eine andere Bibliothek wie siphon , ransack, has_scope etc ...

Hier ist ein funktionierendes Beispiel aus der README

Das Modell:

%Vor%

Der Controller

%Vor%

Die Ansicht:

%Vor%     
charlysisto 22.12.2013 09:11
quelle
0

Sie können sich ansehen, was in ActsAsAdjacent gemacht wurde:

%Vor%

Im Wesentlichen sind sie Bereiche (pre Rails 3-Syntax), um Datensätze abzurufen, deren IDs kleiner / größer als die ID des gesendeten Datensatzes sind.

Da es sich um Bereiche handelt, können Sie vorherige mit "first" verketten, um das erste Element zu erhalten, das vor dem aktuellen Element erstellt wurde, und .getagged_with ("mountain"), um das erste Element mit "mountain" zu erhalten / p>     

clemensp 27.03.2011 23:30
quelle