我需要通过ActiveRecord从表中获取随机记录。我遵循了Jamis Buck from 2006中的示例。
然而,我也通过谷歌搜索遇到了另一种方式(由于新的用户限制,无法使用链接):
rand_id = rand(Model.count)
rand_record = Model.first(:conditions => ["id >= ?", rand_id])
我很好奇这里的其他人是如何做到的,或者是否有人知道什么方法会更有效。
发布于 2010-05-02 10:40:45
一旦记录被删除,你的示例代码将开始表现不准确(它将不公平地偏爱ids较低的项)
在数据库中使用随机方法可能会更好。根据您使用的数据库不同,它们会有所不同,但是:order => "RAND()“适用于mysql,order => "RANDOM()”适用于postgres
Model.first(:order => "RANDOM()") # postgres example
发布于 2013-08-20 02:42:55
这并不需要那么难。
ids = Model.pluck(:id)
random_model = Model.find(ids.sample)
pluck
返回表中所有id的数组。数组上的sample
方法返回数组中的随机id。
这应该表现良好,具有相同的选择概率和对删除行的表的支持。您甚至可以将其与约束相混合。
User.where(favorite_day: "Friday").pluck(:id)
从而随机选择一个喜欢星期五的用户,而不是任何一个用户。
发布于 2011-08-17 21:43:23
我做了一个rails 3 gem来处理这个问题:
https://github.com/spilliton/randumb
它可以让你做这样的事情:
Model.where(:column => "value").random(10)
https://stackoverflow.com/questions/2752231
复制相似问题