如何随机化`ActiveRecord :: Relation`的数组元素位置?

时间:2012-03-14 06:45:37

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord random

我正在运行Ruby on Rails 3.2.2,我想随机化ActiveRecord::Relation的数组元素位置

我该怎么做?

3 个答案:

答案 0 :(得分:21)

您可以随时将.order('random()')添加到关系:

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

您甚至可以将其添加为范围:

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

有几点需要注意:

  1. PostgreSQL和SQLite使用random(),MySQL使用rand(),我不确定其他数据库。
  2. ORDER BY random()在数据库中可能非常昂贵,因此您不希望使用此项,除非您的WHERE子句(即.where调用)将限制您将应用的结果集的大小ORDER BY random() to。
  3. 在 ORDER BY之后将应用 .limit,因此x.limit(n).order('random()')会将ORDER BY应用于所有x,然后应用limit(n)排序后。这是(2)中的警告来自。

答案 1 :(得分:1)

鉴于Store.itemshas_many关系,您可以

a = store.items.all.shuffle

答案 2 :(得分:0)

Client.first.users.sample怎么办?