7
votes

Comment trier_by date dans ruby ​​(pas rails)?

Je sais que les rails ont des méthodes de tri intégrées à ActiveCord, mais je suis juste en train d'écrire un script rubis clair et d'aimer de trier les enregistrements d'un tableau par date.

La date serait stockée dans l'une des cellules de la matrice multidimensionnelle.

Quelle est la meilleure façon pour moi de m'approcher cela, je peux donc arriver au point où je viens de faire trier_by_date et j'indique soit ASC ou desc < / code>?

Je n'ai pas à utiliser la méthode trier_by_date , mais j'aimerais pouvoir appeller facilement une méthode sur la collection et obtenir les résultats que je veux.

pensées?


2 commentaires

essayez quelque chose et publier ce que vous avez obtenu, de préférence un code qui peut être exécuté de manière indépendante, en d'autres termes, vous montrer le code


Je suppose que vous voulez quelque chose comme: arr.sort_by {| x | x.date}


5 Réponses :


14
votes

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 "Invalid direction. Specify either ASC or DESC."    
      end
    end
  end


0 commentaires

15
votes
def sort_by_date(dates, direction="ASC")
  sorted = dates.sort
  sorted.reverse! if direction == "DESC"
  sorted
end

1 commentaires

C'est une solution intriguante ... merci!



5
votes

Ce qui suit pourrait ne pas fonctionner pour l'objet de date, mais devrait fonctionner pour des objets DateTime. En effet, les objets DateTime peuvent être convertis en entiers.

J'ai récemment dû faire un tri descendant pour des objets DateTime et c'est ce que j'ai proposé. P>

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


1 commentaires

Notez que datetime # to_i est une extension de support active. Ce n'est pas dans le noyau de rubis.



6
votes

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

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


1 commentaires

Utilisation de #sort_by convertit implicitement les valeurs en fonction du bloc. Donc, cela utilisera plus de mémoire, mais cela ne va pas d'analyser toutes les comparaisons.



0
votes

J'utilise une ancienne version des rails et Rabl et cela fonctionne pour moi xxx


0 commentaires