una soporta segundo rapida por optimizar optimizacion mas lentas hacer cuantas consultas consulta con como ruby sorting

ruby - soporta - optimizacion de consultas sql



¿Cómo puedo ordenar por múltiples condiciones con diferentes órdenes? (5)

Realmente me gustaría manejar esto sin parches de mono, pero aún no he podido encontrar otra opción.

Tengo una matriz (en Ruby) que necesito ordenar por múltiples condiciones. Sé cómo usar el método de clasificación y he usado el truco para ordenar usando una variedad de opciones para ordenar por múltiples condiciones. Sin embargo, en este caso necesito la primera condición para clasificar ascendente y la segunda para clasificar descendente. Por ejemplo:

ordered_list = [[1, 2], [1, 1], [2, 1]]

¿Alguna sugerencia?

Editar: Acabo de darme cuenta de que debo mencionar que no puedo comparar fácilmente el primer y el segundo valor (en realidad, estoy trabajando con atributos de objeto aquí). Entonces, para un simple ejemplo, es más como:

ordered_list = [[1, "b"], [1, "a"], [2, "a"]]


Estaba teniendo una pesadilla de vez en cuando tratando de encontrar la manera de revertir un atributo específico, pero normalmente clasifico los otros dos. Solo una nota sobre la clasificación para aquellos que vienen después de esto y se confunden con | a, b | sintaxis de bloque No puedes usar {|a,b| a.blah <=> b.blah} {|a,b| a.blah <=> b.blah} estilo de bloque con sort_by! o sort_by . ¡Debe ser usado con sort! o sort Además, como se indicó anteriormente en los otros pósters, intercambie b través del operador de comparación <=> para invertir el orden de clasificación. Me gusta esto:

Para ordenar por bla y rastrear normalmente, pero ordenar por bleu en orden inverso, haga esto:

something.sort!{|a,b| [a.blah, b.bleu, a.craw] <=> [b.blah, a.bleu, b.craw]}

¡También es posible usar el signo - con sort_by or sort_by! para hacer una ordenación inversa en los números (hasta donde yo sé, solo funciona en los números, así que no lo intentes con cadenas ya que solo comete errores y mata la página).

Supongamos que a.craw es un número entero. Por ejemplo:

something.sort_by!{|a| [a.blah, -a.craw, a.bleu]}


He estado usando la receta de Glenn desde hace bastante tiempo. Cansado de copiar código de proyecto en proyecto una y otra vez, he decidido convertirlo en una joya:

http://github.com/dadooda/invert


Qué tal si:

ordered_list = [[1, "b"], [1, "a"], [2, "a"]] ordered_list.sort! do |a,b| [a[0],b[1]] <=> [b[0], a[1]] end


Tuve el mismo problema básico y lo resolví añadiendo esto:

class Inverter attr_reader :o def initialize(o) @o = o end def <=>(other) if @o.is && other.o.is -(@o <=> other.o) else @o <=> other.o end end end

Este es un contenedor que simplemente invierte la función <=>, que luego te permite hacer cosas como esta:

your_objects.sort_by {|y| [y.prop1,Inverter.new(y.prop2)]}


Enumerable#multisort es una solución genérica que se puede aplicar a matrices de cualquier tamaño , no solo a aquellas con 2 elementos. Los argumentos son booleanos que indican si un campo específico debe ordenarse ascendente o descendentemente (uso a continuación):

items = [ [3, "Britney"], [1, "Corin"], [2, "Cody"], [5, "Adam"], [1, "Sally"], [2, "Zack"], [5, "Betty"] ] module Enumerable def multisort(*args) sort do |a, b| i, res = -1, 0 res = a[i] <=> b[i] until !res.zero? or (i+=1) == a.size args[i] == false ? -res : res end end end items.multisort(true, false) # => [[1, "Sally"], [1, "Corin"], [2, "Zack"], [2, "Cody"], [3, "Britney"], [5, "Betty"], [5, "Adam"]] items.multisort(false, true) # => [[5, "Adam"], [5, "Betty"], [3, "Britney"], [2, "Cody"], [2, "Zack"], [1, "Corin"], [1, "Sally"]]