118 votes

Ruby on Rails : comment trier avec deux colonnes en utilisant ActiveRecord ?

Je veux trier par deux colonnes, l'une est une DateTime (updated_at), et l'autre est une Decimal (Prix)

Je voudrais pouvoir trier d'abord par updated_at, puis, si plusieurs éléments se produisent le même jour, trier par prix.

182voto

Christian Fazzini Points 7446

Dans Rails 4, vous pouvez faire quelque chose de similaire à :

Model.order(foo: :asc, bar: :desc)

foo et bar sont des colonnes dans le db.

71voto

Daniel Vandersluis Points 30498

En supposant que vous utilisez MySQL,

Model.all(:order => 'DATE(updated_at), price')

Notez la distinction par rapport aux autres réponses. La colonne updated_at sera un horodatage complet, donc si vous voulez trier en fonction du jour où elle a été mise à jour, vous devez utiliser une fonction pour obtenir juste la partie date à partir de l'horodatage. Dans MySQL, c'est DATE().

70voto

Erik Escobedo Points 1279
Thing.find(:all, :order => "updated_at desc, price asc")

fera l'affaire.

Mise à jour :

Thing.all.order("updated_at DESC, price ASC")

est le Rails 3 façon d'aller. (Merci @cpursley)

20voto

Ruby Racer Points 1773

En fait, il existe de nombreuses façons de le faire en utilisant Active Record. Un qui n'a pas été mentionné ci-dessus serait (dans différents formats, tous valables) :

Model.order(foo: :asc).order(:bar => :desc).order(:etc)

Peut-être que c'est plus verbeux, mais personnellement, je trouve que c'est plus facile à gérer. SQL est produit en une seule étape :

SELECT "models".* FROM "models" ORDER BY "models"."etc" ASC, "models"."bar" DESC, "models"."foo" ASC

Ainsi, pour la question initiale :

Model.order(:updated_at).order(:price)

Vous n'avez pas besoin de déclarer le type de données, ActiveRecord le fait en douceur, tout comme votre moteur de base de données

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