使用Rails将记录分类到桶中



我有一个游戏模型,它有一个datetime,存储游戏的日期和时间。我想把这些记录放到每个日期数组的数组中。

可能的输出数组示例:

[
  [
    #<Game id: 7, datetime: "2014-03-03 05:30:00">,
    #<Game id: 12, datetime: "2014-03-03 11:30:00">,
    #<Game id: 14, datetime: "2014-03-03 12:30:00">,
    #<Game id: 17, datetime: "2014-03-03 12:45:00">
  ],
  [
    #<Game id: 1, datetime: "2014-04-06 05:30:00">,
    #<Game id: 2, datetime: "2014-04-06 11:30:00">,
    #<Game id: 4, datetime: "2014-04-06 12:30:00">,
    #<Game id: 7, datetime: "2014-04-06 12:45:00">
  ]
]

这是我目前正在尝试的

@games = Array.new
Game.all.each do |game|
  # in my model I have a function date that gets the date part of my datetime
  quit = false
  index = 0
  while !quit do
    if index < @games.length
      quit = true
      @games << [game]
    elsif @games[index].first.date == game.date
      quit = true
      @games[index] << game
    end
  end
end

但这似乎不是很像红宝石,可能不是最有效的方式。有更好的方法吗?

这可能不是最有效的方法,但它简短且易读:

@games = {}
Game.all.each do |game|
  @games[game.date] = [] if !@games.has_key? game.date
  @games[game.date] << game
end
@games = @games.values

请注意,Ruby习惯使用数组和哈希字面值[]{},而不是它们各自的Array.newHash.new构造函数。

<标题> 更新

这里有一个更好的方法,使用Enumerablegroup_by方法,集合可以将其作为一个模块包含:

@games = Game.all.group_by { |game| game.date }

请注意,这将返回一个使用日期作为键的散列,但您可以通过在散列上调用values方法轻松地将其转换为数组。

最新更新