Domanda

Voglio dare agli utenti la possibilità di sfogliare i miei post sul blog in ordine casuale.

Non posso implementarlo in questo modo:

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

poiché il parametro :order viene chiamato con ogni query e quindi rischio di ripetere post sul blog.

Qual è il modo migliore per farlo?

È stato utile?

Soluzione

RAND accetta un seme in MySQL:

RAND(N) 

Dai documenti MySQL :

  

RAND (), RAND (N)

     

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

Altri database dovrebbero avere funzionalità simili.

Se usi il seme STESSO ogni volta che chiami RAND, l'ordine sarà coerente tra le richieste e puoi impaginare di conseguenza.

È quindi possibile archiviare il seed nella sessione dell'utente, in modo che ogni utente vedrà un insieme di risultati univoci per loro.

Altri suggerimenti

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

Se si desidera che ciascun utente disponga di un ordine casuale univoco, salvare l'ordine in una matrice di sessioni di ID.

Se non ti dispiace che tutti gli utenti abbiano lo stesso ordine casuale, allora hai una colonna di posizione nella tabella dei post.

Potresti: ordine = > RANDOM () sulla tua query originale che popola @posts e quindi quando impagini, non specificare l'ordine.

Crea un ambito denominato sul tuo modello Post che incapsuli il comportamento casuale:

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

Il tuo PostsController codice diventa quindi:

@posts = Post.random.paginate :page => params[:page]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top