Sono in esecuzione Ruby on Rails 3.2.2 e vorrei randomizzare elemento dell'array posizioni di un ActiveRecord::Relation
.Come randomizzare le posizioni degli elementi dell'array di un `ActiveRecord :: Relation`?
Come posso farlo?
Sono in esecuzione Ruby on Rails 3.2.2 e vorrei randomizzare elemento dell'array posizioni di un ActiveRecord::Relation
.Come randomizzare le posizioni degli elementi dell'array di un `ActiveRecord :: Relation`?
Come posso farlo?
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:
random()
, MySQL utilizza rand()
, io non sono sicuro di altri database.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..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).che dire Client.first.users.sample
?
hai ragione, ma è possibile restituire un 'ActiveRecord :: Relation' (non un Array Ruby)? – Backo
dato che Store.items
è una relazione has_many
, si può fare
a = store.items.all.shuffle
È 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
@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). –
* BTW *: quanti dischi sono considerati un "piccolo set"/"tavolino"? – Backo