2012-03-14 13 views

risposta

19

Si può sempre aggiungere .order('random()') la relazione:

ar = Model.where(...).where(...).order('random()') 

Si potrebbe anche aggiungere che come ambito:

class Model < ActiveRecord::Base 
    scope :randomize, order('random()') 
end 

ci sono alcune cose da essere a conoscenza o f:

  1. PostgreSQL e SQLite uso random(), MySQL utilizza rand(), io non sono sicuro di altri database.
  2. ORDER BY random() può essere piuttosto costoso nel database, quindi non si desidera utilizzare questo a meno che le clausole WHERE (ad esempio chiamate .where) limiteranno la dimensione del set di risultati che si applicherà ORDER BY random() a.
  3. Un .limit valida solo dopo ORDER BY modo x.limit(n).order('random()') applicherà ORDER BY per tutti x e quindi applicare limit(n) dopo l'ordinamento. Qui è dove viene l'avvertenza in (2).
+0

È diverso e/o importante (relativo alle prestazioni) se dichiaro 'x.limit (n) .order ('random()')' o 'x.order ('random()'). Limit (n) '? Cioè, quelle due affermazioni sono uguali? – Backo

+0

@Backo: sono gli stessi. Tutta la roba della relazione AR crea semplicemente una query SQL pezzo dopo pezzo, quindi l'ordine effettivo in cui le cose accadono dipende esclusivamente da come il database (cioè SQL) lo fa. Ecco perché non vuoi '.order ('random()')' a meno che tu non abbia un piccolo tavolo o il tuo limite '.where() il tuo risultato sia impostato su un piccolo insieme di righe e perché ho incluso il punto (3). –

+1

* BTW *: quanti dischi sono considerati un "piccolo set"/"tavolino"? – Backo

0

che dire Client.first.users.sample?

+0

hai ragione, ma è possibile restituire un 'ActiveRecord :: Relation' (non un Array Ruby)? – Backo

0

dato che Store.items è una relazione has_many, si può fare

a = store.items.all.shuffle 
+0

In questo momento non posso "provare"/"eseguire" il tuo codice ... quindi, il metodo 'shuffle' restituisce un' ActiveRecord :: Relation'? – Backo

+0

@Backo No, sarà un array. – Baldrick

+1

@Backo Sono curioso di sapere perché è necessario tenerlo in un 'ActiveRecord :: Relation'? – Baldrick

Problemi correlati