Ruby on Rails:我如何使用ActiveRecord对两列进行sorting?

我想按两列进行sorting,一个是DateTime( updated_at ),另一个是Decimal(Price)

我希望能够通过updated_at首先sorting,然后,如果多个项目在同一天发生,按价格sorting。

假设你正在使用MySQL,

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

注意与其他答案的区别。 updated_at列将是一个完整的时间戳,所以如果你想根据更新的date进行sorting,你需要使用一个函数从时间戳中获取date部分。 在MySQL中,这是DATE()

在Rails 4中,你可以做类似于:

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

foobar是db中的列。

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

会做的伎俩。

更新:

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

是目前的路要走。 (谢谢@cpursley )

活动logging查询接口允许您指定尽可能多的属性,您想要订购您的查询:

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

或者如果你想得到更具体的(谢谢@ zw963 ):

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

奖金:第一个查询后,您可以链接其他查询:

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

实际上有很多方法可以使用Active Record来实现。 上面没有提到的是(各种格式,都是有效的):

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

也许它更详细,但我个人觉得更容易pipe理。 SQL只有一步产生:

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

因此,对于原来的问题:

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

你不需要声明数据types,ActiveRecord可以顺利地完成这个工作,你的数据库引擎也是如此

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

这些都没有为我工作! 经过两天的互联网顶部和底部看,我find了一个解决scheme!

可以说你在产品表中有很多列,包括:special_price和msrp。 这是我们正在尝试整理的两列。

好的,首先在你的模型中添加这一行:

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

其次,在产品控制器中,添加您需要执行search的位置:

 @search = Product.sorted_by_special_price_asc_msrp_asc.search(search_params)