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

Bac*_*cko 11 ruby random activerecord ruby-on-rails ruby-on-rails-3

我on Rails的3.2.2运行Ruby和我想随机数组元素的位置ActiveRecord::Relation.

我怎样才能做到这一点?

mu *_*ort 21

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

ar = Model.where(...).where(...).order('random()')
Run Code Online (Sandbox Code Playgroud)

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

class Model < ActiveRecord::Base
    scope :randomize, order('random()')
end
Run Code Online (Sandbox Code Playgroud)

有几点需要注意:

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