2009-08-14 7 views

Répondre

105

Ruby comprend un support pour le tri de la boîte.

sorted = @records.sort_by &:created_at 

Cependant, cela ne semble pas avoir beaucoup à voir avec l'affichage et appartient probablement au contrôleur.

+2

Enumerable # sort_by est excellent pour ce genre de chose, beaucoup mieux que l'autre exemple avec Enumerable # sort. – tadman

+1

merci pour la clarification. J'ai plusieurs "points d'entrée" à la même vue, et les requêtes peuvent ou peuvent ne pas avoir les mêmes modèles de tri (je sais, pas idéal). Mais n'est-ce pas l'ordre dans lequel les listes de choses seront affichées, pas nécessairement une fonction "contrôleur seulement"? – user94154

+1

tadman - le soin d'élaborer? Les api docs ont compris que tri_by est la façon la plus lente et la plus souple de faire les choses. Idéal pour les sortes plus complexes, mais trop pour quelque chose d'aussi simple. –

24

Il suffit d'appeler un tri sur la collection, en passant dans le bloc de code qui indique Ruby comment vous voulez trier:

collection.sort { |a,b| a.created_at <=> b.created_at } 
+0

merci beaucoup pour la réponse rapide – user94154

+2

C'est trop inefficace par rapport à '.sort_by' dans ce cas. S'il vous plaît vérifier l'autre réponse par Chuck. – Dogbert

+6

Pour l'anecdote, ce ne sera pas moins efficace que la version que j'ai donnée. – Chuck

25

Alors que Ruby Enumerable est impressionnant, les requêtes ActiveRecord retourne en fait un ActiveRecord :: Relation dont la requête n'aura pas encore été évaluée (chargement paresseux) et peut être invoquée par la méthode de commande pour décharger ce traitement dans la base de données où elle sera beaucoup mieux mise à l'échelle qu'une stratégie basée sur Enumerable. L'utilisation de Enumerable pour le tri est également source de confusion pour la pagination dans la base de données. Rien n'empêche d'appliquer la stratégie de commande dans la vue. Cependant, j'aurais tendance à mettre cela dans le champ d'application du modèle.

sorted = @records.order(:created_at) 
1

S'il vous plaît pillez à celui-ci et vérifiez également la complexité.

Model.all.sort_by{|m| m.created_at} #=> O(log n) 

#versus 

Model.order(“created_at DESC”) #=> O(1) 
0

La meilleure façon de tri tableau ActiveRecord utilise la méthode par défaut pour

@ users.order (: created_at)

Il est le plus rapide et la solution la plus juste, parce que dans ce cas il renvoie un tableau trié de db et vous n'avez pas besoin d'utiliser une autre opération pour cela dans la classe, par exemple si vous utilisez sort_by suggéré, il lancera en boucle chaque élément de tableau, et après cela, il ne sera pas un tableau ActiveRecord , ne pas cool à mon avis.

order peuvent utiliser des chaînes et sumbols, il est très utile, et il prend plusieurs paramètres

@ users.order ('created_at asc, prenom desc, last_name asc)

Questions connexes