Paginieren durch eine randomisierte Liste von Blog-Posts will_paginate mit
-
03-07-2019 - |
Frage
Ich möchte den Benutzern, um durch meine Blog-Posts in zufälliger Reihenfolge die Möglichkeit geben.
ich es so nicht umsetzen können:
@posts = Post.paginate :page => params[:page], :order => 'RANDOM()'
, da der :order
Parameter mit jeder Abfrage aufgerufen wird, und daher Blog-Posts I Risiko wiederholen.
Was ist der beste Weg, dies zu tun?
Lösung
RAND akzeptiert einen Samen in MySQL:
RAND(N)
Von dem MySQL docs :
RAND (), RAND (N)
Gibt einen zufälligen Fließkommawert v im Bereich von 0 <= v <1,0. Wenn ein konstante ganze Zahl N ist Argument angegeben ist, wird es als Keim verwendet Wert, der erzeugt einen wiederholbaren Sequenz von Spaltenwerten. In dem folgende Beispiel ist zu beachten, daß die Sequenzen der Werte von RAND (3) erzeugten beide Orte der gleiche ist, wo es auftritt.
Andere Datenbanken sollten ähnliche Funktionen haben.
Wenn Sie die SAME verwenden Saatgut jedes Mal, wenn Sie RAND aufrufen, wird die Bestellung über Anfragen konsistent sein und Sie können entsprechend Paginieren.
Sie können dann speichern Sie die Samen in der Sitzung des Benutzers - so dass jeder Benutzer einen Satz von Ergebnissen einzigartig um sie sehen.
Andere Tipps
jede Seite zu vermeiden (generiert aus einer neuen Anfrage) möglicherweise eine wiederholte Post mit Sie die Reihenfolge der Beiträge irgendwo zum Abruf über mehrere Anfragen speichern müssen.
Wenn Sie jeden Benutzer wollen dann eine eindeutige zufällige Reihenfolge haben, die Reihenfolge, in einer Sitzung Array von IDs speichern.
Wenn Sie nicht alle Benutzer dagegen hat die gleiche zufällige Reihenfolge mit dann eine Position Spalte in der Tabelle Beiträge.
Sie könnten:. Order => RANDOM () auf Ihrer ursprünglichen Abfrage, die @posts auffüllt, und dann, wenn Sie Paginieren, geben Sie nicht den Auftrag
Erstellen Sie einen genannt Umfang auf Ihrem Beitrag Modell, das das zufällige Verhalten kapselt:
class Post < ActiveRecord::Base
named_scope :random, :order => 'RANDOM()'
.
.
.
end
Ihr PostsController
Code wird dann:
@posts = Post.random.paginate :page => params[:page]