2009-05-01 2 views

risposta

3

RAND accetta un seme in MySQL:

RAND(N) 

Dal MySQL docs:

RAND(), RAND (N)

Restituisce un valore a virgola mobile casuale v in l'intervallo 0 < = v < 1.0. Se un costante argomento intero N è specificato, viene usato come valore di seme , che produce una ripetibile sequenza di valori di colonna. Nell'esempio seguente, , si noti che le sequenze di valori prodotti da RAND (3) sono le stesse in entrambi i punti in cui si verificano.

Altri database dovrebbero avere funzionalità simili.

Se si utilizza il seme SAME ogni volta che si chiama RAND, l'ordine sarà coerente tra le richieste e si può impaginare di conseguenza.

È possibile quindi memorizzare il seme nella sessione dell'utente - in modo che ogni utente vedrà una serie di risultati unici per loro.

+0

Qual è la sintassi per l'utilizzo di RANDOM() con un seme? Non riesco a trovarlo –

+0

Aggiunti dettagli sulla sintassi per MySQL –

0

Si potrebbe: order => RANDOM() sulla query originale che popola @posts, e poi quando si impagina, non specificare l'ordine.

-2

Creare un named scope del modello Post che incapsula il comportamento casuale:

class Post < ActiveRecord::Base 
    named_scope :random, :order => 'RANDOM()' 
    . 
    . 
    . 
end 

Il codice PostsController diventa quindi:

@posts = Post.random.paginate :page => params[:page] 
+0

Questo non funzionerà - riceverai un numero casuale di 30 (o comunque la dimensione della tua pagina) ogni volta. –

1

Per evitare ogni pagina (generato da una nuova richiesta) potenzialmente avere un post ripetuto dovrai archiviare l'ordine dei post da qualche parte per il recupero su più richieste.

Se si desidera che ogni utente di avere un ordine casuale unico quindi salvare l'ordine in un array di ID di sessione.

Se non ti dispiace a tutti gli utenti che hanno lo stesso ordine casuale quindi avere una colonna posizione nella tabella messaggi.