【发布时间】:2012-03-14 06:45:36
【问题描述】:
我正在运行 Ruby on Rails 3.2.2,我想随机化 ActiveRecord::Relation 的数组元素位置。
我该怎么做?
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3 activerecord random
我正在运行 Ruby on Rails 3.2.2,我想随机化 ActiveRecord::Relation 的数组元素位置。
我该怎么做?
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3 activerecord random
您可以随时将.order('random()') 添加到关系中:
ar = Model.where(...).where(...).order('random()')
您甚至可以将其添加为范围:
class Model < ActiveRecord::Base
scope :randomize, order('random()')
end
有几点需要注意:
random(),MySQL 使用 rand(),其他数据库我不确定。ORDER BY random() 在数据库中可能非常昂贵,因此您不想使用它,除非您的 WHERE 子句(即 .where 调用)会限制您将应用 ORDER BY random() 的结果集的大小。李>
.limit 将应用在 ORDER BY 之后,因此 x.limit(n).order('random()') 将 ORDER BY 应用到所有 x,然后在排序后应用 limit(n)。这就是 (2) 中的警告的来源。【讨论】:
x.limit(n).order('random()') 或 x.order('random()').limit(n),它是否不同和/或重要(与性能有关)?也就是说,这两个语句是相等的?
.order('random()'),除非你有一个小桌子或者你的.where()s 将你的结果集限制为一小组行,以及为什么我包括第 (3) 点。
鉴于Store.items 是has_many 关系,您可以这样做
a = store.items.all.shuffle
【讨论】:
shuffle 方法是否返回 ActiveRecord::Relation?
ActiveRecord::Relation 中?
Client.first.users.sample 呢?
【讨论】:
ActiveRecord::Relation(不是一个Ruby数组)?