我有一个游戏模型,它有一个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.new
和Hash.new
构造函数。
这里有一个更好的方法,使用Enumerable
的group_by
方法,集合可以将其作为一个模块包含:
@games = Game.all.group_by { |game| game.date }
请注意,这将返回一个使用日期作为键的散列,但您可以通过在散列上调用values
方法轻松地将其转换为数组。