Voglio ordinare per due colonne, una è un DateTime ( updated_at
) e l’altra è un decimale (prezzo)
Vorrei essere in grado di ordinare prima da updated_at, quindi, se più elementi si verificano nello stesso giorno, ordinare per Prezzo.
Supponendo che tu stia usando MySQL,
Model.all(:order => 'DATE(updated_at), price')
Nota la distinzione dalle altre risposte. La colonna updated_at
sarà un timestamp completo, quindi se si desidera ordinare in base al giorno in cui è stato aggiornato, è necessario utilizzare una funzione per ottenere solo la parte della data dal timestamp. In MySQL, questo è DATE()
.
In Rails 4 puoi fare qualcosa di simile a:
Model.order(foo: :asc, bar: :desc)
foo
e bar
sono 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 corrente da percorrere. (Grazie a @cpursley )
L’interfaccia query record triggers consente di specificare tutti gli attributi che si desidera 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)
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
Quindi, per la domanda originale:
Model.order(:updated_at).order(:price)
Non è necessario dichiarare il tipo di dati, ActiveRecord lo fa senza problemi, e così pure il tuo DB Engine
Model.all(:order => 'updated_at, price')
Nessuno di questi ha funzionato per me! Dopo esattamente 2 giorni di guardare in alto e in basso su internet, ho trovato una soluzione !!
diciamo che hai molte colonne nella tabella prodotti inclusi: special_price e msrp. Queste sono le due colonne con cui stiamo cercando di ordinare.
Ok, prima nel tuo modello aggiungi questa linea:
named_scope :sorted_by_special_price_asc_msrp_asc, { :order => 'special_price asc,msrp asc' }
In secondo luogo, nel controller del prodotto, aggiungere dove è necessario eseguire la ricerca:
@search = Product.sorted_by_special_price_asc_msrp_asc.search(search_params)