使用Rails将记录排序到存储桶中

时间:2014-03-20 05:47:41

标签: ruby-on-rails ruby algorithm sorting ruby-on-rails-4

我有一个具有日期时间的游戏模型,存储游戏的播放日期和时间。我想将这些记录放入每个日期的数组数组中。

可能的结果数组示例:

[
  [
    #<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

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

1 个答案:

答案 0 :(得分:1)

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

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

请注意,使用数组和散列文字[]{}而不是各自的Array.newHash.new构造函数是惯用的Ruby。

更新

这是一种更好的方法,使用Enumerablegroup_by方法,这些方法可以包含为模块:

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

请注意,这将使用日期作为键返回哈希值,但您可以通过在哈希上调用values方法将其轻松转换为数组。