Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:获取特定数量的随机记录_Ruby On Rails_Ruby On Rails 3_Activerecord_Random_Limit - Fatal编程技术网

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

Ruby on rails Rails:获取特定数量的随机记录,ruby-on-rails,ruby-on-rails-3,activerecord,random,limit,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在我的应用程序中,集合仅由管理员/mods创建,因此我们可以强制执行集合中的照片数不得少于13张。我需要的是能够开始随机选

因此,我的应用程序中有属于收藏的照片。我想能够显示13张照片从一个特定的收集在一个页面上

我试过这个:

c = Collection.first
@photos = c.photos.offset(rand(c.photos.count)).limit(13)
这有点管用。问题是,如果收集的照片不超过13张,那么它不一定会返回13张照片。我需要确切地得到13张照片

FWIW在我的应用程序中,集合仅由管理员/mods创建,因此我们可以强制执行集合中的照片数不得少于13张。我需要的是能够开始随机选择超过13张照片


我怎样才能做到这一点呢?

只要在sql中对它们进行随机排序,然后取前13个。 我们也要这样做:


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

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

这里有一个快速的解决方案。。目前使用它的记录超过150万条,性能良好。最好的解决方案是缓存一个或多个随机记录集,然后使用后台工作程序以所需的时间间隔刷新它们

创建了
随机记录\u 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

这在SQlite和PostgreSQL中有效吗?我对SQL不是很在行,但由于SQL的不同,我的开发环境和生产环境在过去有过一些问题。您可以随时尝试找出答案。我很确定
RAND()
在大多数SQL实现中都能工作。但要小心,因为它效率极低,而且在较大的数据集上执行所需的时间远远超过需要的时间。POSTGRES和SQLite3使用“RANDOM()”。这是特定于数据库的。这显然非常慢。你的评论说“最多13张照片”,这会返回13张照片吗?如果它返回的照片少于13张,我就不能使用它。如果收藏的照片ID少于13张,它就不能返回13张照片。否则,是的。
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))