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?

War es hilfreich?

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]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top