9 votes

Comment trier par date en Ruby (sans Rails) ?

Je sais que Rails dispose de méthodes de tri intégrées dans ActiveRecord, mais j'écris simplement un script en ruby classique et j'aimerais trier les enregistrements d'un tableau par date.

La date serait stockée dans l'une des cellules du tableau multidimensionnel.

Quelle est la meilleure façon pour moi d'aborder cela, afin que je puisse en arriver au point où je peux simplement faire sort_by_date et indiquer soit ASC ou DESC ?

Je n'ai pas forcément à utiliser la méthode sort_by_date, mais l'idée est que j'aimerais pouvoir appeler facilement une méthode sur la collection et obtenir les résultats souhaités.

Des idées ?

17voto

fl00r Points 41855
def sort_by_date(dates, direction="ASC")
  sorted = dates.sort
  sorted.reverse! if direction == "DESC"
  sorted
end

16voto

DanS Points 4992

Quelque chose comme ça?

  class Array
    def sort_by_date(direction="ASC")
      if direction == "ASC"
        self.sort
      elsif direction == "DESC"
        self.sort {|a,b| b <=> a}
      else
        raise "Direction non valide. Spécifiez soit ASC ou DESC."    
      end
    end
  end

Un tableau multidimensionnel n'est qu'un tableau de tableaux, alors appelez cette méthode sur la 'dimension' que vous voulez trier.

8voto

Facu Farias Points 44

La façon dont je le fais en ce moment c'est :

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

Et avec l'opérateur ! je modifie la même variable (sinon j'aurais besoin d'une autre variable pour contenir la variable modifiée). Jusqu'à présent, ça marche à merveille.

6voto

Jonathan Abrams Points 587

Le code suivant pourrait ne pas fonctionner pour l'objet Date, mais devrait fonctionner pour les objets DateTime. Cela est dû au fait que les objets DateTime peuvent être convertis en entier.

Récemment, j'ai dû effectuer un tri descendant pour les objets DateTime et voici ce que j'ai trouvé.

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

1voto

carlitos Points 19

Je suis en train d'utiliser une ancienne version de Rails et rabl et cela fonctionne pour moi

collection @name_of_your_collection.sort! { |a,b|  DateTime.parse(a['start_at']) <=> DateTime.parse(b['start_at']) }
node do |s|
 # lots of attributes
  s
end

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X