[英]Ruby on Rails: how do I sort with two columns using ActiveRecord?
我想按两列排序,一列是DateTime( updated_at
),另一列是十进制(价格)
我希望能够先使用updated_at进行排序,然后,如果同一天出现多个项目,则按价格排序。
在Rails 4中,你可以做类似的事情:
Model.order(foo: :asc, bar: :desc)
foo
和bar
是db中的列。
假设您正在使用MySQL,
Model.all(:order => 'DATE(updated_at), price')
请注意与其他答案的区别。 updated_at
列将是一个完整的时间戳,因此如果要根据更新的日期进行排序,则需要使用函数从时间戳中获取日期部分。 在MySQL中,即DATE()
。
Thing.find(:all, :order => "updated_at desc, price asc")
会做的。
Thing.all.order("updated_at DESC, price ASC")
是Rails 3的方法。 (谢谢@cpursley )
Active Record Query Interface允许您指定要为查询订购的任意数量的属性:
models = Model.order(:date, :hour, price: :desc)
或者如果你想更具体(感谢@ zw963 ):
models = Model.order(price: :desc, date: :desc, price: :asc)
奖励:在第一次查询后,您可以链接其他查询:
models = models.where('date >= :date', date: Time.current.to_date)
实际上有很多方法可以使用Active Record来实现。 上面没有提到的将是(以各种格式,全部有效):
Model.order(foo: :asc).order(:bar => :desc).order(:etc)
也许它更冗长,但我个人觉得它更容易管理。 SQL仅在一步中生成:
SELECT "models".* FROM "models" ORDER BY "models"."etc" ASC, "models"."bar" DESC, "models"."foo" ASC
因此,对于原始问题:
Model.order(:updated_at).order(:price)
您无需声明数据类型,ActiveRecord可以顺利地执行此操作,您的数据库引擎也是如此
Model.all(:order => 'updated_at, price')
这些都不适合我! 在通过互联网查看顶部和底部两天后,我找到了解决方案!
假设您在products表中有许多列,包括:special_price和msrp。 这些是我们尝试排序的两列。
好的,首先在您的模型中添加以下行:
named_scope :sorted_by_special_price_asc_msrp_asc, { :order => 'special_price asc,msrp asc' }
其次,在Product Controller中,添加执行搜索所需的位置:
@search = Product.sorted_by_special_price_asc_msrp_asc.search(search_params)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.