2012-01-10 129 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

相关问题