Pregunta

Quiero darles a los usuarios la capacidad de navegar por las publicaciones de mi blog en orden aleatorio.

No puedo implementarlo así:

@posts = Post.paginate :page => params[:page], :order => 'RANDOM()'

ya que el parámetro :order se llama con cada consulta y, por lo tanto, me arriesgo a repetir publicaciones de blog.

¿Cuál es la mejor manera de hacer esto?

¿Fue útil?

Solución

RAND acepta una semilla en MySQL:

RAND(N) 

Del documentos MySQL :

  

RAND (), RAND (N)

     

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

Otras bases de datos deberían tener una funcionalidad similar.

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

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

Otros consejos

Para evitar que cada página (generada a partir de una nueva solicitud) tenga potencialmente una publicación repetida, deberá almacenar el orden de las publicaciones en algún lugar para recuperarlas a través de múltiples solicitudes.

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

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

Podría: order = > RANDOM () en su consulta original que llena @posts, y luego cuando pagina, no especifique el orden.

Cree un alcance con nombre en su modelo de publicación que encapsula el comportamiento aleatorio:

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

Su código PostsController se convierte en:

@posts = Post.random.paginate :page => params[:page]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top