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.
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.
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()
.
Thing.find(:all, :order => "updated_at desc, price asc")
fera l'affaire.
Thing.all.order("updated_at DESC, price ASC")
est le Rails 3 façon d'aller. (Merci @cpursley)
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 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.