RubyonRails: 如何使用 ActiveRecord 对两列进行排序?

我想按两列排序,一个是 DateTime (updated_at) ,另一个是 Decimal (Price)

我希望能够首先通过 update _ at 进行排序,然后,如果同一天出现多个项目,则按 Price 进行排序。

91904 次浏览
Model.all(:order => 'updated_at, price')
Thing.find(:all, :order => "updated_at desc, price asc")

会有用的。

Update:

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

是 Rails 3的方向。(感谢 @ cpursley)

假设你用的是 MySQL,

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

请注意与其他答案的区别。updated_at列将是一个完整的时间戳,因此如果希望根据更新后的 白天进行排序,则需要使用一个函数从时间戳中获取日期部分。在 MySQL 中,这是 DATE()

活动记录查询接口 允许您指定任意多的属性,只要您希望 order查询:

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

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

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

Bonus: After the first query, you can chain other queries:

models = models.where('date >= :date', date: Time.current.to_date)

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

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

foobar是数据库中的列。

实际上,有很多方法可以使用活动记录来实现这一点。上面没有提到的是(以各种形式,都是有效的) :

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

Thusly, for the original question:

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

您不需要声明数据类型,ActiveRecord 可以顺利地完成这项工作,数据库引擎也是如此

这些对我都没用! 经过整整2天的寻找顶部和底部在互联网上,我找到了一个解决方案! !

假设在 products 表中有许多列,包括: special _ price 和 msrp。这是我们要排序的两列。

好吧,你的第一个模型 加上这一行:

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

Second, in the Product Controller, add where you need to perform the search:

@search = Product.sorted_by_special_price_asc_msrp_asc.search(search_params)