2009-05-01 11 views

Respuesta

3

RAND acepta una semilla en MySQL:

RAND(N) 

Desde el MySQL docs:

RAND(), RAND (N)

devuelve un valor de punto flotante aleatorio v en el rango 0 < = v < 1.0. Si se especifica un argumento entero constante N es , se utiliza como valor de semilla , que produce una secuencia repetible de valores de columna . En el siguiente ejemplo , tenga en cuenta que las secuencias de valores producidos por RAND (3) son los mismos en ambos lugares donde se produce.

Otras bases de datos deberían tener funciones similares.

Si usa el MISMO semilla cada vez que llama a RAND, el pedido será coherente en todas las solicitudes y puede paginar en consecuencia.

Luego puede almacenar la semilla en la sesión del usuario, para que cada usuario vea un conjunto de resultados únicos para ellos.

+0

¿Cuál es la sintaxis para usar RANDOM() con una semilla? No puedo encontrarlo –

+0

Detalles de sintaxis añadidos para MySQL –

0

Usted podría: ordenar => RANDOM() en su consulta original que rellena @posts, y luego cuando pagine, no especifique el orden.

-2

Crear un named scope de su modelo Post que encapsula el comportamiento aleatorio:

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

Su código PostsController Ésta se transforma en:

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

Esto no funcionará - obtendrá un número aleatorio de 30 (o el tamaño de su página es grande) publicaciones cada vez. –

1

Para evitar cada página (generado a partir de una nueva solicitud) que pueden tener una publicación repetida necesitarás almacenar el orden de las publicaciones en algún lugar para recuperarlas en múltiples solicitudes.

Si desea que cada usuario tenga un pedido aleatorio único, guarde el pedido en una matriz de ID de sesión.

Si no te importa que todos los usuarios tengan el mismo orden aleatorio, entonces ten una columna de posición en la tabla de publicaciones.

Cuestiones relacionadas