Ruby on Rails按日期分组后如何反转日期排序顺序?
解决方法
有两种简单的方式可以实现你想要的日期排序反转:
方法一:先按创建时间降序排序,再分组
这是最可靠的方式——我们先让数据库把游戏记录按created_at从新到旧排序,之后再分组时,最新的日期会先被纳入分组,自然就排在最前面了。修改你的代码如下:
class PagesController < ApplicationController def home @games = Game.all @game_days = Game.order(created_at: :desc).group_by { |g| g.created_at.strftime("%B, %d") } end end
为什么这样有效?默认情况下Game.all会按记录ID升序排列(也就是创建时间从早到晚),所以分组时旧日期会先被处理,导致昨天的分组排在前面。而order(created_at: :desc)会让最新的记录先被取出,分组时今天的日期就会成为第一个键。
方法二:反转分组后的哈希顺序
如果你不想修改查询语句,也可以直接对分组后的哈希进行反转操作。Ruby从2.1版本开始,哈希是保持插入顺序的,所以反转后就能把最新的日期移到前面:
@game_days = Game.all.group_by { |g| g.created_at.strftime("%B, %d") }.reverse
不过要注意,如果你的日期范围涉及多个月份,字符串形式的日期(比如"January 01")排序可能会出现逻辑偏差(比如字母顺序和时间顺序不一致),所以方法一还是更推荐的方案。
内容的提问来源于stack exchange,提问作者Henri
相关产品推荐
相关产品推荐

