Rails:获取特定数量的随机记录

时间:2011-03-17 17:06:52

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

因此,我的应用拥有属于收藏集的照片。我希望能够在页面上显示来自特定集合的13张照片。

我试过了:

c = Collection.first
@photos = c.photos.offset(rand(c.photos.count)).limit(13)

这是有效的。问题是,如果该系列没有超过13张照片,那么它不一定会返回13张照片。我需要专门准确地拍摄13张照片。

FWIW对于我的应用程序,集合只由admins / mods创建,因此我们可以强制执行任何集合不会少于13张照片。我需要的是能够开始随机选择照片超过13个。

我怎么能这样做?

3 个答案:

答案 0 :(得分:13)

您可以先选择13个随机关联的照片ID,然后进行数据库查询以获取它们:

c = Collection.first
random_ids = c.photo_ids.sort_by { rand }.slice(0, 13)
@photos = Photo.where(:id => random_ids)

答案 1 :(得分:6)

只需在sql中随机排序,然后取第13个。 所以:

c.photos.order("RAND()").limit(13)

答案 2 :(得分:-1)

这是一个快速的解决方案..目前使用它超过150万条记录并获得不错的性能。最好的解决方案是缓存一个或多个随机记录集,然后以所需的时间间隔与后台工作者刷新它们。

创建random_records_helper.rb文件:

module RandomRecordsHelper

 def random_user_ids(n)
    user_ids = []
    user_count = User.count
    n.times{user_ids << rand(1..user_count)}
    return user_ids
 end

在控制器中:

@users = User.where(id: random_user_ids(10))