因此,我的应用拥有属于收藏集的照片。我希望能够在页面上显示来自特定集合的13张照片。
我试过了:
c = Collection.first
@photos = c.photos.offset(rand(c.photos.count)).limit(13)
这是有效的。问题是,如果该系列没有超过13张照片,那么它不一定会返回13张照片。我需要专门准确地拍摄13张照片。
FWIW对于我的应用程序,集合只由admins / mods创建,因此我们可以强制执行任何集合不会少于13张照片。我需要的是能够开始随机选择照片超过13个。
我怎么能这样做?
答案 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))