2011-11-23 76 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