web-dev-qa-db-fra.com

Tableau de tri renvoyé par ActiveRecord par date (ou toute autre colonne)

Comment puis-je trier un tableau renvoyé par une requête ActiveRecord par un created_at colonne de date?

Cela se produit une fois la requête exécutée.

Veuillez ne pas me dire de le faire dans la requête car j'ai besoin que cela se produise dans la vue.

62
user94154

Ruby inclut la prise en charge du tri de la boîte.

sorted = @records.sort_by &:created_at

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

121
Chuck

Alors que Ruby Enumerable est génial, les requêtes ActiveRecord renverront en fait un ActiveRecord :: Relation dont la requête n'aura pas encore été évaluée (Lazy Loading) et peut avoir la méthode de commande appelé pour décharger ce traitement dans la base de données où il évoluera bien mieux qu'une stratégie basée sur Enumerable .

L'utilisation d'Enumerable pour le tri perturbe également la pagination dans la base de données. Rien n'empêche d'appliquer la stratégie d'ordre dans la vue. Cependant, j'aurais tendance à mettre cela dans le champ d'application du modèle.

sorted = @records.order(:created_at)
32
shulmang

Appelez simplement sort sur la collection, en passant le bloc de code qui indique Ruby comment vous voulez qu'il trie:

collection.sort { |a,b| a.created_at <=> b.created_at }
26
Bill D

Veuillez regarder celui-ci et vérifier également les complexités.

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

#versus

Model.order(“created_at DESC”) #=> O(1)
5
Sajjad Murtaza

La meilleure façon de trier le tableau ActiveRecord est d'utiliser l'ordre des méthodes par défaut

@ users.order (: created_at)

C'est la solution la plus rapide et la plus appropriée, car dans ce cas, elle renvoie un tableau trié à partir de db et vous n'avez pas besoin d'utiliser une autre opération pour cela dans la classe, par exemple si vous utiliserez le _ sort_by il va lancer en boucle chaque élément du tableau, et après cela ce ne sera plus un tableau ActiveRecord, pas cool à mon avis.

order peut utiliser des chaînes et des sumbols, c'est très utile, et cela prend plusieurs paramètres

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

2
Dmitriy Gusev