2012-05-25 18 views
6

Wiem, że Rails ma metody sortowania wbudowane w ActiveRecord, ale ja właśnie piszę prosty, stary skrypt ruby ​​i chciałbym posortować rekordy z tablicy według daty.Jak sortować według daty w Ruby (nie Rails)?

Data będzie przechowywana w jednej z komórek tablicy wielowymiarowej.

Jaki jest najlepszy sposób, aby się do tego podejść, więc mogę przejść do punktu, w którym po prostu robię sort_by_date i wskazuję albo ASC lub DESC?

Nie muszę używać metody sort_by_date, ale chodzi o to, że chciałabym móc łatwo wywołać metodę z kolekcji i uzyskać pożądane rezultaty.

Myśli?

+1

Szeregi rubinowe mają metody sortowania. Czytaj dokumenty i spróbuj czegoś. –

+0

wypróbuj coś i opublikuj to, co masz, najlepiej jakiś kod, który można uruchomić samodzielnie, innymi słowy, pokaż nam kod – peter

+1

Założę się, że chcesz coś takiego: arr.sort_by {| x | x.date} – texasbruce

Odpowiedz

10

Coś takiego?

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 

Wielowymiarowy tablica jest po prostu tablica tablic, tak nazywają tę metodę na „wymiar”, które chcesz posortować.

+0

Dzięki! To działa. – marcamillion

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

To intrygujące rozwiązanie ... Dzięki! – marcamillion

+0

<3 to jest sposób czystszy – shime

2

Następujące elementy mogą nie działać dla obiektu Date, ale powinny działać dla obiektów DateTime. Dzieje się tak dlatego, że obiekty DateTime można przekonwertować na liczbę całkowitą.

Niedawno musiałem zrobić sortowanie malejące dla obiektów DateTime i to właśnie wymyśliłem.

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

Tak jak ja to robię teraz to:

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

I z! operator Mam wpływ na tę samą zmienną (w przeciwnym razie potrzebuję innego, aby pomieścić zmodyfikowaną zmienną). Jak na razie działa to jako urok.

+1

eleganckie rozwiązanie – iGallina

+1

Użycie '# sort_by' niejawnie konwertuje wartości na podstawie bloku. Będzie więc wykorzystywać więcej pamięci, ale nie będzie również wywoływać analizowania wszystkich porównań. – kjprice

Powiązane problemy