Ruby on Rails:如何使用ActiveRecord对两列进行排序?

时间:2010-08-27 20:09:30

标签: ruby-on-rails

我想按两列排序,一列是DateTime(updated_at),另一列是十进制(价格)

我希望能够先使用updated_at进行排序,然后,如果同一天出现多个项目,请按价格排序。

7 个答案:

答案 0 :(得分:127)

在Rails 4中,你可以做类似的事情:

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

foobar是数据库中的列。

答案 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' }