shuffle然后对db查询ruby进行排序

时间:2015-02-19 23:51:39

标签: ruby-on-rails ruby sorting activerecord shuffle

我正在尝试显示按日排序的文章列表,但每天都会随机显示。

这就是我现在所拥有的:

@articles = Article.all.shuffle.sort_by{|t| t.date_published}.reverse

我当时认为排序会发生在洗牌阵列上,但似乎并没有发生这种情况。任何帮助将不胜感激!

我尝试过group_by似乎无法让它发挥作用。

2 个答案:

答案 0 :(得分:3)

首先对您的代码有一点了解:all将从数据库中获取所有记录并将其传递给您的ruby代码,这是资源和时间消耗。然后,shufflesort_byreverse全部由ruby执行。随着数据库的增长,您将很快遇到性能问题。

您的解决方案是让数据库服务器完成这项工作。数据库服务器针对所有排序操作进行了优化。因此,如果你使用MySQL,你应该使用它:

@articles = Article.order('`articles`.`date_published` DESC, RAND()')

主要按相反顺序的date_published排序,其次是同一日期的所有文章随机排序

答案 1 :(得分:0)

嗯,这是 工作的有趣黑客:

@articles = Article.
  all.
  sort_by{|t| (t.date_published.beginning_of_day.to_i * 1000) + rand(100)}

这可以通过强制所有日期成为当天的开始(例如,'2015-02-19'上发布的所有内容都具有相同的to_i值。然后乘以1000并添加排序的0到100之间的随机数(任何小于1000的数字都可以)。