Je veux trier par deux colonnes, l'une est un DateTime ( updated_at
) et l'autre est un Decimal (Price)
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 un DateTime ( updated_at
) et l'autre est un Decimal (Price)
Je voudrais pouvoir trier d'abord par updated_at, puis, si plusieurs éléments se produisent le même jour, trier par prix.
Réponses:
En supposant que vous utilisez MySQL,
Model.all(:order => 'DATE(updated_at), price')
Notez la distinction avec les autres réponses. La updated_at
colonne sera un horodatage complet, donc si vous souhaitez trier en fonction du jour où elle a été mise à jour, vous devez utiliser une fonction pour obtenir uniquement la partie date à partir de l'horodatage. Dans MySQL, c'est DATE()
.
order
comme ça:Model.all(:order => "day asc, `order` asc")
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.
Thing.all.order("updated_at DESC, price ASC")
est la voie à suivre pour Rails 3. (Merci @cpursley )
Thing.all.order("updated_at DESC, price ASC")
Thing.order("LOWER(name), number")
.
Interface de requête d'enregistrement actif vous permet de spécifier autant d'attributs que vous souhaitez ordonner votre requête:
models = Model.order(:date, :hour, price: :desc)
ou si vous voulez être plus précis (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)
model
de models
sorte qu'une personne sache qu'il est pluralisé. Juste une suggestion.
:asc
au lieu de asc
:Model.order({price: :desc}, {date: :desc}, {price: :asc})
En fait, il existe de nombreuses façons de le faire en utilisant Active Record. Celui qui n'a pas été mentionné ci-dessus serait (dans divers formats, tous valides):
Model.order(foo: :asc).order(:bar => :desc).order(:etc)
C'est peut-être plus bavard, 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 facilement, tout comme votre DB Engine
Model.order(foo: :asc).order(:bar => :desc).order(:etc)
? L'ordre des clauses d'ordre dans le SQL est le contraire de ce que j'obtiens quand je cours .to_sql
dessus.
Aucun de ceux-ci n'a fonctionné pour moi! Après exactement 2 jours de recherche de haut en bas sur Internet, j'ai trouvé une solution !!
disons que vous avez de nombreuses colonnes dans la table products, y compris: special_price et msrp. Ce sont les deux colonnes avec lesquelles nous essayons de trier.
D'accord, tout d'abord dans votre modèle, ajoutez 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)
:order => ["DATE(#{table_name}.updated_at)", :price]
(Notez que:price
c'est un symbole.)