2012-01-10 16 views
8

Quiero ser capaz de clasificar 12 equipos en una lista de acuerdo con 4 criterios diferentes.Ordene una lista con múltiples condiciones Ruby on Rails

voy a tener una tabla db denominación de equipos y cada equipo tendrá varias columnas como matches_won, matches_lost, etc ...

Quiero mostrarlos en orden basado en matches_won. Esto es facil. Sin embargo, si dos equipos están empatados en matches_won, entonces debo verificar si se han jugado entre sí y quién ganó. Si tienen el mismo matches_won Y no se han jugado entre sí, sus registros se comparan en otros dos criterios y se clasifican de acuerdo con eso. Creo que si puedo descubrir cómo hacer una condición adicional para poder descifrar cómo hacer las demás. Entonces, por el bien de la brevedad, no los detallaré aquí.

No sé cómo hacer esta clasificación de niveles múltiples en Rails.

He pensado que quizás agregar una columna 'rango' en la tabla db y la función before_save que los clasifica yendo a la base de datos y luego simplemente enumerarlos en la vista en función de ese rango. Pero eso me deja con el mismo problema (sin saber cómo hacer la clasificación condicional) simplemente lo hace antes del guardado en lugar de cuando lo leí fuera de la base de datos.

¡Cualquier ayuda sería apreciada!

Respuesta

15

Utilice sort_by y proporcione una matriz de valores. Los comparará de izquierda a derecha. La ordenación predeterminada es ascendente, por lo que si quieres que todo lo contrario (por ejemplo, matches_won se ordene descendentemente para que la mayoría coincida con uno primero, en lugar de matches_lost, que debe clasificarse de menor a mayor), debes negar el valor.

He aquí un ejemplo

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

grandes obras que en 3 de los criterios que estoy comparando, pero no la 4ª. Si hay dos equipos con las mismas coincidencias_won, necesito verificar de alguna manera y ver si se han jugado entre sí y, de ser así, quién ganó y clasificar al ganador en el lugar más alto. Estoy seguro de que esta pregunta es tan específica para mí que es difícil de responder. Seguiré buscando en Google. Gracias por tu ayuda. –

+1

Usa ordenar en lugar de ordenar_por. Luego le dará los dos equipos que se comparan, y puede comparar por lo que desee. Consulte los documentos para ver ejemplos de cómo hacer esto. http://rubydoc.info/stdlib/core/1.9.3/Enumerable#sort-instance_method –