我想按两列排序,一列是DateTime(updated_at
),另一列是十进制(价格)
我希望能够先使用updated_at进行排序,然后,如果同一天出现多个项目,请按价格排序。
答案 0 :(得分:127)
在Rails 4中,你可以做类似的事情:
Model.order(foo: :asc, bar: :desc)
foo
和bar
是数据库中的列。
答案 1 :(得分:60)
假设你正在使用MySQL,
Model.all(:order => 'DATE(updated_at), price')
请注意与其他答案的区别。 updated_at
列将是一个完整的时间戳,因此如果您想根据日对其进行排序,则需要使用函数从时间戳中获取日期部分。在MySQL中,即DATE()
。
答案 2 :(得分:53)
Thing.find(:all, :order => "updated_at desc, price asc")
会做到这一点。
Thing.all.order("updated_at DESC, price ASC")
是Rails 3的方法。 (谢谢@cpursley)
答案 3 :(得分:26)
Active Record Query Interface可让您根据需要order指定任意数量的属性:
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)
答案 4 :(得分:17)
实际上有很多方法可以使用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可以顺利地执行此操作,您的数据库引擎也是如此。
答案 5 :(得分:2)
Model.all(:order => 'updated_at, price')
答案 6 :(得分:0)
这些都不适合我! 经过2天的互联网上下搜索,我找到了解决方案!!
假设您在products表中有许多列,包括:special_price和msrp。这些是我们尝试排序的两列。
好的,首先在你的模型中 添加以下行:
java -server -Xmx26g -Djava.awt.headless=true -Dfile.encoding=UTF-8 -jar
top - 01:34:10 up 252 days, 8:02, 1 user, load average: 0.00, 0.02, 0.00
Tasks: 127 total, 1 running, 126 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.8%us, 0.2%sy, 0.0%ni, 97.7%id, 0.2%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 37049860k total, 3225916k used, 33823944k free, 331836k buffers
Swap: 10223608k total, 0k used, 10223608k free, 2409808k cached
top - 03:57:04 up 252 days, 8:02, 1 user, load average: 0.01, 0.02, 0.00
Tasks: 145 total, 1 running, 144 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni, 99.8%id, 0.2%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 37108368k total, 36117600k used, 990768k free, 218364k buffers
Swap: 2031608k total, 120k used, 2031488k free, 33518948k cached
其次,在产品控制器中,添加执行搜索所需的位置:
named_scope :sorted_by_special_price_asc_msrp_asc, { :order => 'special_price asc,msrp asc' }