Ruby on Rails: come faccio a ordinare con due colonne usando ActiveRecord?

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.

Aggiornare:

 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)