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

Je veux trier par deux colonnes, l'une est un DateTime (updated_at), et l'autre est un nombre Décimal (de Prix)

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

65
demandé sur Arslan Ali 2010-08-28 00:09:29

7 réponses

En supposant que vous utilisez MySQL,

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

Notez la distinction des autres réponses. La colonne updated_at sera un horodatage complet, donc si vous voulez trier en fonction du Jour Il a été mis à jour, vous devez utiliser une fonction pour obtenir uniquement la partie date de l'horodatage. Dans MySQL, c'est-à-dire DATE().

57
répondu Daniel Vandersluis 2010-08-27 20:28:13

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

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

foo et bar sont des colonnes dans la base de données.

111
répondu Christian Fazzini 2013-10-18 08:45:20
Thing.find(:all, :order => "updated_at desc, price asc")

Fera l'affaire.

Mise à jour:

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

Est la voie actuelle. (Merci @cpursley)

47
répondu Erik Escobedo 2017-05-23 10:31:12

Active Record Interface de Requête permet d'indiquer autant d'attributs que vous souhaitez commande votre requête:

models = Model.order(:date, :hour, price: :desc)

Ou si vous voulez obtenir plus spécifique (merci @zw963 ):

models = Model.order(price: :desc, date: :desc, price: :asc) 

Bonus: Après la première requête, vous pouvez enchaîner d'autres requêtes:

models = models.where('date >= :date', date: Time.current.to_date)
21
répondu golfadas 2018-09-07 09:16:22

En fait, il y a plusieurs façons de le faire en utilisant Active Record. Un qui n'a pas été mentionné ci-dessus serait (dans divers formats, tous valides):

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

Peut-être que c'est plus verbeux, mais personnellement, je trouve ça 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

Donc, 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 DB

14
répondu Ruby Racer 2014-01-11 21:52:56
Model.all(:order => 'updated_at, price')
2
répondu robertokl 2010-08-27 20:16:45

Aucun de ceux-ci n'a fonctionné pour moi! Après exactement 2 jours de recherche en haut et en bas sur internet, j'ai trouvé une solution!!

Disons que vous avez beaucoup de colonnes dans la table des produits, y compris: special_price et msrp. Ce sont les deux colonnes que nous essayons de trier.

Ok, D'abord dans votre modèle ajouter cette ligne:

named_scope :sorted_by_special_price_asc_msrp_asc, { :order => 'special_price asc,msrp asc' }

Deuxièmement, dans le contrôleur de produit, ajoutez où vous devez effectuer la recherche:

@search = Product.sorted_by_special_price_asc_msrp_asc.search(search_params)
0
répondu Max Alexander Hanna 2016-08-12 00:54:31