2012-01-10 127 views
8

我希望能夠根據4個不同的標準在列表中排列12個團隊。對多個條件的列表進行排序Ruby on Rails

我會叫db表隊,每隊都會有像matches_won,matches_lost等各列...

我想在基於matches_won以顯示它們。這很容易。但是,如果兩支隊伍並列match_won,那麼我必須檢查他們是否打過對手,誰贏了。如果他們有相同的matches_won並且沒有互相玩過,他們的記錄會根據另外兩個標準進行比較並按照其排名。我想如果我能想出如何做一個額外的條件,我將能夠弄清楚如何去做其他的事情。爲了簡潔起見,我不會在這裏詳細介紹它們。

我不知道如何在Rails中進行這種多級排序。

我曾想過可能在數據庫表和before_save函數中添加一個'rank'列,將它們排入數據庫中,然後根據該等級將它們列入視圖中。但是,這給我留下了相同的問題(不知道如何進行條件排序),它只是在保存之前執行,而不是從數據庫中讀取。

任何幫助,將不勝感激!

回答

15

使用sort_by並提供一組值。它會按從左到右的順序進行比較。默認排序是升序,所以如果你想要相反的話(例如,matches_won應該降序排列,以便大多數匹配一個首先,而不是匹配_lost,應該排序從最低到最高),你需要否定該值。

下面是一個例子

require 'pp' 
Team = Struct.new :won, :lost, :demerits, :style 

teams = Array.new(20) { Team.new rand(5), rand(5), rand(5), rand(5) } 
puts "Before sort:" 
pp teams 

puts "", "After sort:" 
pp teams 
teams.sort_by! { |team| [-team.won, team.lost, team.demerits, -team.style] } 
# >> Before sort: 
# >> [#<struct Team won=1, lost=2, demerits=4, style=3>, 
# >> #<struct Team won=0, lost=4, demerits=2, style=2>, 
# >> #<struct Team won=4, lost=1, demerits=2, style=3>, 
# >> #<struct Team won=1, lost=4, demerits=1, style=4>, 
# >> #<struct Team won=3, lost=1, demerits=1, style=4>, 
# >> #<struct Team won=3, lost=4, demerits=1, style=2>, 
# >> #<struct Team won=4, lost=0, demerits=4, style=0>, 
# >> #<struct Team won=3, lost=4, demerits=1, style=2>, 
# >> #<struct Team won=1, lost=4, demerits=1, style=2>, 
# >> #<struct Team won=3, lost=0, demerits=1, style=1>, 
# >> #<struct Team won=3, lost=4, demerits=3, style=4>, 
# >> #<struct Team won=1, lost=4, demerits=0, style=0>, 
# >> #<struct Team won=3, lost=4, demerits=2, style=0>, 
# >> #<struct Team won=3, lost=0, demerits=3, style=0>, 
# >> #<struct Team won=1, lost=2, demerits=0, style=1>, 
# >> #<struct Team won=3, lost=0, demerits=1, style=0>, 
# >> #<struct Team won=0, lost=4, demerits=1, style=4>, 
# >> #<struct Team won=1, lost=4, demerits=3, style=0>, 
# >> #<struct Team won=3, lost=3, demerits=2, style=3>, 
# >> #<struct Team won=0, lost=4, demerits=4, style=4>] 
# >> 
# >> After sort: 
# >> [#<struct Team won=4, lost=0, demerits=4, style=0>, 
# >> #<struct Team won=4, lost=1, demerits=2, style=3>, 
# >> #<struct Team won=3, lost=0, demerits=1, style=1>, 
# >> #<struct Team won=3, lost=0, demerits=1, style=0>, 
# >> #<struct Team won=3, lost=0, demerits=3, style=0>, 
# >> #<struct Team won=3, lost=1, demerits=1, style=4>, 
# >> #<struct Team won=3, lost=3, demerits=2, style=3>, 
# >> #<struct Team won=3, lost=4, demerits=1, style=2>, 
# >> #<struct Team won=3, lost=4, demerits=1, style=2>, 
# >> #<struct Team won=3, lost=4, demerits=2, style=0>, 
# >> #<struct Team won=3, lost=4, demerits=3, style=4>, 
# >> #<struct Team won=1, lost=2, demerits=0, style=1>, 
# >> #<struct Team won=1, lost=2, demerits=4, style=3>, 
# >> #<struct Team won=1, lost=4, demerits=0, style=0>, 
# >> #<struct Team won=1, lost=4, demerits=1, style=4>, 
# >> #<struct Team won=1, lost=4, demerits=1, style=2>, 
# >> #<struct Team won=1, lost=4, demerits=3, style=0>, 
# >> #<struct Team won=0, lost=4, demerits=1, style=4>, 
# >> #<struct Team won=0, lost=4, demerits=2, style=2>, 
# >> #<struct Team won=0, lost=4, demerits=4, style=4>] 
+0

這對我比較標準,但不是4 3的偉大工程。如果有兩支球隊的match_won相同,我需要以某種方式檢查並看看他們是否玩過彼此,如果是的話,誰贏得了最高點的勝利者。 我確定這個問題對我來說很特殊,很難回答。我會繼續Google搜索。謝謝你的幫助。 – 2012-01-10 02:48:27

+1

使用sort而不是sort_by。然後它會給你們兩個進行比較的球隊,你可以通過任何你想要的比較。查看文檔以瞭解如何執行此操作的示例。 http://rubydoc.info/stdlib/core/1.9.3/Enumerable#sort-instance_method – 2012-01-10 03:44:09

相關問題