洗牌然后排序数据库查询 ruby

shuffle then sort a db query ruby

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

这是我现在拥有的:

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

我原以为排序会在打乱后的数组上进行,但似乎并没有发生。任何帮助将不胜感激!

我试过 group_by 似乎无法正常工作。

嗯,这是一个应该有用的有趣技巧:

@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 的数字都可以)。

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

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

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

这将主要按 date_published 倒序排序,然后对同一日期的所有文章随机排序