2012-05-25 24 views
6

Sé que Rails tiene métodos de clasificación integrados en ActiveRecord, pero solo estoy escribiendo un script simple de ruby ​​y me encantaría ordenar los registros de una matriz por fecha.Cómo ordenar por fecha en Ruby (no en Rieles)?

La fecha se almacenaría en una de las celdas de la matriz multidimensional.

¿Cuál es la mejor manera de abordar esto, así que puedo llegar al punto en el que acabo de hacer sort_by_date e indicar ASC o DESC?

No tengo que usar el método sort_by_date, pero la idea es que me gustaría poder llamar fácilmente un método en la colección y obtener los resultados que quiero.

¿Pensamientos?

+1

Las matrices de Ruby tienen métodos de clasificación. Lee los documentos e intenta algo. –

+0

intente algo y publique lo que tiene, preferiblemente algún código que se pueda ejecutar de forma independiente, en otras palabras, muéstrenos el código – peter

+1

Supongo que quiere algo como: arr.sort_by {| x | x.date} – texasbruce

Respuesta

10

¿Algo como esto?

class Array 
    def sort_by_date(direction="ASC") 
     if direction == "ASC" 
     self.sort 
     elsif direction == "DESC" 
     self.sort {|a,b| b <=> a} 
     else 
     raise "Invalid direction. Specify either ASC or DESC."  
     end 
    end 
    end 

Una matriz multidimensional es sólo una matriz de matrices, por lo que llaman a este método en la 'dimensión' que desea ordenar.

+0

¡Gracias! Esto funciona. – marcamillion

12
def sort_by_date(dates, direction="ASC") 
    sorted = dates.sort 
    sorted.reverse! if direction == "DESC" 
    sorted 
end 
+0

Esta es una solución intrigante ... ¡Gracias! – marcamillion

+0

<3 esto es mucho más limpio – shime

2

El siguiente podría no funcionar para el objeto Date, pero debería funcionar para los objetos DateTime. Esto se debe a que los objetos DateTime se pueden convertir en un entero.

Recientemente tuve que hacer una ordenación descendente para objetos DateTime y esto es lo que se me ocurrió.

def sort_by_datetime(dates, direction="ASC") 
    dates.sort_by { |date| direction == "DESC" ? -date.to_i : date } 
end 
2

La manera en que yo estoy haciendo en este momento es:

@collection.sort! { |a,b| DateTime.parse(a['date']) <=> DateTime.parse(b['date']) } 

Y con el! operador, estoy afectando a la misma variable (de lo contrario, necesitaré otra para mantener la variable modificada). Hasta ahora, está funcionando como un encanto.

+1

solución elegante – iGallina

+1

El uso de '# sort_by' convierte implícitamente los valores basados ​​en el bloque. Entonces usará más memoria, pero tampoco va a llamar a analizar cada comparación. – kjprice

Cuestiones relacionadas