我有一个具有日期时间的游戏模型,存储游戏的播放日期和时间。我想将这些记录放入每个日期的数组数组中。
可能的结果数组示例:
[
[
#<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
但这似乎不是很像红宝石,可能不是最有效的方式。对此有更好的方法吗?
答案 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.new
和Hash.new
构造函数是惯用的Ruby。
这是一种更好的方法,使用Enumerable
的group_by
方法,这些方法可以包含为模块:
@games = Game.all.group_by { |game| game.date }
请注意,这将使用日期作为键返回哈希值,但您可以通过在哈希上调用values
方法将其轻松转换为数组。