Rails 3怎么获取随机记录?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (10)

我找到了在Rails 2中查找随机记录的几个例子

首选的方法似乎是:

Thing.find :first, :offset => rand(Thing.count)

我不知道如何使用Rails 3中的新查找语法来构建它。

提问于
用户回答回答于
Thing.first(:order => "RANDOM()") # For MySQL :order => "RAND()", - thanx, @DanSingerman
# Rails 3
Thing.order("RANDOM()").first

Thing.first(:offset => rand(Thing.count))
# Rails 3
Thing.offset(rand(Thing.count)).first

实际上,在Rails 3中,所有的示例都会工作。但使用秩序RANDOM对于大表来说,速度相当慢,但更多的是sql样式。

可以对索引列(PostgreSQL语法)使用以下技巧:

select * 
from my_table 
where id >= trunc(
  random() * (select max(id) from my_table) + 1
) 
order by id 
limit 1;
用户回答回答于

如果表中有删除记录,解决方案就有缺陷。

解决方法可以是

users_count = User.count
User.scoped.limit(1).offset(rand(users_count)).first

这转换为两个查询

SELECT COUNT(*) FROM `users`
SELECT `users`.* FROM `users` LIMIT 1 OFFSET 148794

并运行约500毫秒。

扫码关注云+社区