Używam Ruby on Rails 3.2.2 i chciałbym randomować element tablicy pozycji z ActiveRecord::Relation
.Jak randomizować pozycje elementów tablicy "ActiveRecord :: Relation"?
Jak mogę to zrobić?
Używam Ruby on Rails 3.2.2 i chciałbym randomować element tablicy pozycji z ActiveRecord::Relation
.Jak randomizować pozycje elementów tablicy "ActiveRecord :: Relation"?
Jak mogę to zrobić?
Zawsze możesz dodać .order('random()')
do relacji:
ar = Model.where(...).where(...).order('random()')
można nawet dodać, że w zakresie:
class Model < ActiveRecord::Base
scope :randomize, order('random()')
end
Jest kilka rzeczy, o których należy pamiętać f:
random()
stosowanie, MySQL używa rand()
, nie jestem pewien o innych baz danych..where
) ograniczą rozmiar zestawu wyników, do którego będziesz stosować ORDER BY random()
..limit
zostaną zastosowane po zlecenia przez tak x.limit(n).order('random()')
zastosuje BY wszystkim x
a następnie zastosować limit(n)
po sortowaniu. Tutaj pojawia się ostrzeżenie w (2).co z Client.first.users.sample
?
Masz rację, ale możesz zwrócić "ActiveRecord :: Relation" (nie Ruby Array)? – Backo
Zważywszy, że Store.items
jest has_many
relacja, można zrobić
a = store.items.all.shuffle
Czy jest inny i/lub ważny (w odniesieniu do wydajności), jeśli zaznaczę 'x.limit (n) .order (" losowy() ")' lub 'x.order ('losowy()'). Limit (n) '? Oznacza to, że te dwa stwierdzenia są równe? – Backo
@Backo: To jest to samo. Wszystkie rzeczy związane z relacjami AR po prostu budują zapytania SQL po kawałku, więc rzeczywista kolejność, w jakiej się dzieje, zależy wyłącznie od tego, jak działa baza danych (to znaczy SQL). Dlatego nie chcesz '.order ('random()')', chyba że masz małą tabelę lub twoje '.where()' s ograniczyć zestaw wyników do małego zestawu wierszy i dlaczego zawarłem punkt (3). –
* BTW *: Ile rekordów uważa się za "mały zestaw"/"mały stolik"? – Backo