洗牌然后排序数据库查询 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 代码,这是耗费资源和时间的。然后shuffle
、sort_by
和reverse
都被ruby执行了。随着数据库的增长,您很快就会遇到性能问题。
您的解决方案是让您的数据库服务器完成这项工作。数据库服务器针对所有排序操作进行了非常优化。因此,例如,如果您使用 MySQL,则应改为使用:
@articles = Article.order('`articles`.`date_published` DESC, RAND()')
这将主要按 date_published 倒序排序,然后对同一日期的所有文章随机排序
我正在尝试显示文章列表,按天排序,但每天随机显示。
这是我现在拥有的:
@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 代码,这是耗费资源和时间的。然后shuffle
、sort_by
和reverse
都被ruby执行了。随着数据库的增长,您很快就会遇到性能问题。
您的解决方案是让您的数据库服务器完成这项工作。数据库服务器针对所有排序操作进行了非常优化。因此,例如,如果您使用 MySQL,则应改为使用:
@articles = Article.order('`articles`.`date_published` DESC, RAND()')
这将主要按 date_published 倒序排序,然后对同一日期的所有文章随机排序