Ruby on Rails: how do I sort with two columns using ActiveRecord?

匿名 (未验证) 提交于 2019-12-03 03:08:02

问题:

I want to sort by two columns, one is a DateTime (updated_at), and the other is a Decimal (Price)

I would like to be able to sort first by updated_at, then, if multiple items occur on the same day, sort by Price.

回答1:

Assuming you're using MySQL,

Model.all(:order => 'DATE(updated_at), price') 

Note the distinction from the other answers. The updated_at column will be a full timestamp, so if you want to sort based on the day it was updated, you need to use a function to get just the date part from the timestamp. In MySQL, that is DATE().



回答2:

In Rails 4 you can do something similar to:

Model.order(foo: :asc, bar: :desc) 

foo and bar are columns in the db.



回答3:

Thing.find(:all, :order => "updated_at desc, price asc") 

will do the trick.

Update:

Thing.all.order("updated_at DESC, price ASC") 

is the current way to go. (Thanks @cpursley)



回答4:

Active Record Query Interface lets you specify as many attributes as you want to order your query:

models = Model.order(:date, :hour, price: :desc) 

or if you want to get more specific (thanks @zw963 ):

models = Model.order({price: :desc}, {date: :desc}, {price: asc})  

Bonus: After the first query, you can chain other queries:

models = models.where("date >= ?", Time.current.to_date) 


回答5:

Actually there are many ways to do it using Active Record. One that has not been mentioned above would be (in various formats, all valid):

Model.order(foo: :asc).order(:bar => :desc).order(:etc) 

Maybe it's more verbose, but personally I find it easier to manage. SQL gets produced in one step only:

SELECT "models".* FROM "models" ORDER BY "models"."etc" ASC, "models"."bar" DESC, "models"."foo" ASC 

Thusly, for the original question:

Model.order(:updated_at).order(:price) 

You need not declare data type, ActiveRecord does this smoothly, and so does your DB Engine



回答6:

Model.all(:order => 'updated_at, price') 


回答7:

None of these worked for me! After exactly 2 days of looking top and bottom over the internet, I found a solution!!

lets say you have many columns in the products table including: special_price and msrp. These are the two columns we are trying to sort with.

Okay, First in your Model add this line:

named_scope :sorted_by_special_price_asc_msrp_asc, { :order => 'special_price asc,msrp asc' } 

Second, in the Product Controller, add where you need to perform the search:

@search = Product.sorted_by_special_price_asc_msrp_asc.search(search_params) 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!