2014-12-02 27 views
0

在我的Rails应用程序中,我想选择模型的三个随机实例并将它们呈现在页面上。 Model.order('RANDOM()').limit(3)的作品,但显然,一旦数据库表中包含大量数据,它将严重影响加载时间,所以我正在寻找一些不仅仅是开发中的东西。Postgres从行中选择3个随机模型实例?

这里的线在我的Rails视图现在:

<% featured = Product.order('RANDOM()').limit(3).where.not(photo_file_name: nil, sold_value: true) %> 

回答

0

有多种方式,你可以做到这一点。哪种方式最好是取决于你的设置,产品数量,等等,等等

ids = Product.pluck(:id).shuffle.slice(0,3) 
featured = Product.where(id: ids) 

只有两个查询,但如果你有一百万的产品,这是一个很大返回,并在Ruby中洗牌。在进行第二次呼叫之前,可以删除所选ID中的一个小竞赛条件。

total = Product.count 
featured = 3.times.map { Product.offset(rand(total).first } 

四个查询,但最后三个是有效的。我的语法可能已关闭,并且可能会有错误,请仔细检查rand(total)返回零或total时会发生什么。另外,对于一些数据库Product.count可能真的是效率低下。