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)
foo
和bar
是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)