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.
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()
.
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.
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)
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)
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
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)