Voglio ordinare per due colonne, una è DateTime ( updated_at) e l'altra è un Decimal (Price)
Vorrei essere in grado di ordinare prima per updated_at, quindi, se più elementi si verificano nello stesso giorno, ordinare per Prezzo.
Voglio ordinare per due colonne, una è DateTime ( updated_at) e l'altra è un Decimal (Price)
Vorrei essere in grado di ordinare prima per updated_at, quindi, se più elementi si verificano nello stesso giorno, ordinare per Prezzo.
Risposte:
Supponendo che tu stia utilizzando MySQL,
Model.all(:order => 'DATE(updated_at), price')
Notare la distinzione dalle altre risposte. La updated_atcolonna sarà un timestamp completo, quindi se desideri ordinare in base al giorno in cui è stato aggiornato, devi utilizzare una funzione per ottenere solo la parte della data dal timestamp. In MySQL, questo è DATE().
ordercosì:Model.all(:order => "day asc, `order` asc")
In Rails 4 puoi fare qualcosa di simile a:
Model.order(foo: :asc, bar: :desc)
fooe barsono colonne nel db.
Thing.find(:all, :order => "updated_at desc, price asc")
farà il trucco.
Thing.all.order("updated_at DESC, price ASC")
è la strada giusta per Rails 3. (Grazie @cpursley )
Thing.all.order("updated_at DESC, price ASC")
Thing.order("LOWER(name), number").
L'interfaccia Active Record Query ti consente di specificare tutti gli attributi che desideri per ordinare la query:
models = Model.order(:date, :hour, price: :desc)
o se vuoi essere più specifico (grazie @ zw963 ):
models = Model.order(price: :desc, date: :desc, price: :asc)
Bonus: dopo la prima query, puoi concatenare altre query:
models = models.where('date >= :date', date: Time.current.to_date)
modelin modelsmodo che una persona sappia che è pluralizzato. Solo un suggerimento.
:ascinvece di asc:Model.order({price: :desc}, {date: :desc}, {price: :asc})
In realtà ci sono molti modi per farlo usando Active Record. Uno che non è stato menzionato sopra sarebbe (in vari formati, tutti validi):
Model.order(foo: :asc).order(:bar => :desc).order(:etc)
Forse è più prolisso, ma personalmente lo trovo più facile da gestire. SQL viene prodotto in un solo passaggio:
SELECT "models".* FROM "models" ORDER BY "models"."etc" ASC, "models"."bar" DESC, "models"."foo" ASC
Pertanto, per la domanda originale:
Model.order(:updated_at).order(:price)
Non è necessario dichiarare il tipo di dati, ActiveRecord lo fa senza problemi, così come il tuo motore di database
Model.order(foo: :asc).order(:bar => :desc).order(:etc)? L'ordine delle clausole di ordine nell'SQL è l'opposto di quello che ottengo quando corro .to_sqlsu quello.
Nessuno di questi ha funzionato per me! Dopo esattamente 2 giorni passati a guardare dall'alto in basso su Internet, ho trovato una soluzione !!
diciamo che hai molte colonne nella tabella dei prodotti, tra cui: special_price e msrp. Queste sono le due colonne con cui stiamo cercando di ordinare.
Ok, prima nel tuo modello aggiungi questa riga:
named_scope :sorted_by_special_price_asc_msrp_asc, { :order => 'special_price asc,msrp asc' }
In secondo luogo, nel Product Controller, aggiungi dove devi eseguire la ricerca:
@search = Product.sorted_by_special_price_asc_msrp_asc.search(search_params)
:order => ["DATE(#{table_name}.updated_at)", :price](Nota che:priceè un simbolo.)