2012-01-10 5 views
8

4つの異なる基準に従ってリスト内の12個のチームをランク付けしたいと考えています。複数の条件でリストをソートする

私はmatches_wonに基づいた順序でそれらを表示したい私はチームと呼ばれるdbテーブルを持っていますし、各チームは、などmatches_won、matches_lost、などのさまざまな列を持っています...

。かんたんだよ。しかし、もし2つのチームがマッチで結ばれているなら、私は彼らがお互いにプレイしたかどうか、また勝った人をチェックしなければならない。彼らが同じマッチを持っていて、お互いにプレイしていなければ、彼らの記録は2つの他の基準で比較され、それによってランク付けされます。私は、もし私が他の人のやり方を理解することができるように、ある種の追加条件をどのように行うかを理解できればと思います。簡潔にするために、私はここでそれらを詳述しません。

Railsでこのマルチレベルソートを行う方法がわかりません。

dbテーブルに「ランク」列を追加し、dbに入るランク付けするbefore_save関数を追加し、そのランクに基づいてビューに単純にリストすると考えました。しかし、それは同じ問題(私は条件付きソートを行う方法を知らない)を私に残すだけではなく、私はデータベースからそれを読むときに保存する前にそれを行います。

助けていただけたら幸いです!

答えて

15

sort_byを使用し、値の配列を指定します。左から順に比較します。デフォルトのソートは昇順であるため、反対の場合(たとえば、matches_wonは降順にソートする必要があります。たとえば、matches_wonは降順に並べ替える必要があります。

は、ここで私が比較してるの基準ではなく、第4の3に素晴らしい作品例

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

です。同じ試合で2つのチームがある場合は、私はどういうわけか彼らがお互いにプレイしたかどうかを確認しなければならない。 私はこの質問が私にはそれほど具体的ではないと確信しています。私はグーグルを続けます。ご協力いただきありがとうございます。 –

+1

sort_byの代わりにsortを使用します。それから、2つのチームが比較され、あなたが望むものを比較することができます。これを行う方法の例については、ドキュメントをチェックしてください。 http://rubydoc.info/stdlib/core/1.9.3/Enumerable#sort-instance_method –