2012-01-10 13 views
8

Bir listeye 4 farklı kritere göre sıralayabilmek istiyorum.Çoklu koşullara sahip bir listeyi sıralama Ruby on Rails

Ben

Ben matches_won dayalı sırayla görüntülemek istediğiniz ... bir db tablo Takımlar denilen ve her takım vb matches_won, matches_lost gibi çeşitli sütunlar bulunur olacaktır. Bu kolay. Ancak, eğer iki takım match_won'a bağlanırsa, birbirlerini oynayıp oynamadıklarını ve kimin kazanıp kazanmadığını kontrol etmeliyim. Aynı match_won'lara sahipler ve birbirlerini oynamadılarsa, kayıtları diğer iki kriterle karşılaştırılır ve sırayla sıralanır. Başkalarına nasıl yapılacağını anlayabilmem için bir ek koşulu nasıl yapacağımı anlayabilirsem düşünüyorum. Kısacası aşk için, onları burada detaylandırmayacağım.

Rails'de bu çok düzeyli sıralamayı nasıl yapacağımı bilmiyorum.

Db tablosuna ve before_save işlevine db alanına giren ve ardından yalnızca bu sıralamaya göre görünümde listeleyen bir "rank" sütunu eklemeyi düşündüm. Ama bu beni aynı sorunla (koşullu sıralama yapmayı bilmeden) bırakıyor, sadece db'den okuduğumda değil, kaydetmeden önce yapıyor.

Herhangi bir yardım için teşekkür ederiz!

cevap

15

sort_by kullanın ve bir değerler dizisi sağlayın. Onları soldan sağa sırayla karşılaştıracaktır. Varsayılan sıralama artan bir değerdir, bu yüzden tam tersini istiyorsanız (örneğin, match_won en çok eşleşen olanın en düşük olanı en yüksek olana eşleşecek şekilde, en çok eşleşen olanın eşleşmesi için azalan şekilde sıralanmalıdır), değeri reddetmeniz gerekir.

İşte karşılaştırıyorum kriterlere ancak 4. 3 güzel çalışıyor bir örnek

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

bu. Eğer aynı match_won'a sahip iki takım varsa, bir şekilde birbirleriyle oynayıp oynamadıklarını kontrol etmeliyim ve eğer varsa, kazananı daha yüksek bir pozisyonda kimin kazandığını ve kimin rütbesini aldığını görmeliyim. Eminim ki bu soru bana cevap vermenin zor olduğunu söyledi. Ben googling tutacağım. Yardım ettiğin için teşekkür ederim. –

+1

sort_by yerine sıralama kullanın. Sonra size karşılaştırılan iki takım verecek ve istediğiniz her şeyi karşılaştırabilirsiniz. Bunun nasıl yapılacağına dair örnekler için dokümanlar kontrol edin. http://rubydoc.info/stdlib/core/1.9.3/Enumerable#sort-instance_method –