2011-11-23 51 views
1

我有下面的代码,我只是想让它看起来更清洁,有什么建议吗?基本上,一个团队有很多游戏,我想合并所有的游戏,并按他们的属性game.game_date排序?我怎样才能让清洁剂在红宝石中追加?

@games = Array.new 
    @teams.each {|team| 
     team_games = team.games 
     @games << team_games 
    } 

    @games = @games.flatten 
+0

我不知道这是一个好主意 - 如果你要删除一个游戏,你必须在'@ teams'一个'team'删除它,然后从'删除@游戏“。我会担心这将是一个干(不要重复自己)侵犯。 –

+0

@AndrewGrimm,你会推荐什么? – Kamilski81

回答

4

如何:

...也许:

@teams.reduce([]) { |memo, team| memo + team.games }.sort_by(&:game_date) 

...这可以在最近的Ruby版本(不知道什么时候该来写入如下in):

@teams.reduce([], :+).sort_by(&:game_date) 

注意:符号#to_proc(位看起来像&:symbol)需要最新版本的Ruby(不太确定所需版本)。 该构造与将类似{ |arg| arg.symbol }的块传递给方法相同。 例如:map(&:games)相当于map { |team| team.games }

NB第二:collectmap是同义词,因为是injectreduce

+1

您可以使用flat_map使其更加优雅:http://www.ruby-doc.org/core-1.9.3/Enumerable.html#method-i-flat_map –

1

这个怎么样?

@games = @teams.map(&:games).flatten