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

uplii1fm  于 2023-03-31  发布在  Ruby
关注(0)|答案(8)|浏览(242)

我想按两列排序,一列是DateTime(updated_at),另一列是Decimal(Price)
我希望能够先按updated_at排序,然后,如果同一天出现多个项目,则按价格排序。

2exbekwf

2exbekwf1#

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

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

foobar是db中的列。

tf7tbtn2

tf7tbtn22#

假设您使用的是MySQL,

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

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

vwhgwdsa

vwhgwdsa3#

Thing.find(:all, :order => "updated_at desc, price asc")

就可以了。

更新:

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

是Rails 3的出路。(谢谢@cpursley)

ippsafx7

ippsafx74#

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)
vcudknz3

vcudknz35#

实际上,使用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可以顺利地完成此操作,您的DB引擎也是如此

disbfnqx

disbfnqx6#

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

v09wglhw7#

你只能用逗号来分隔

.where(your query).order("name desc, status asc")
ccgok5k5

ccgok5k58#

这些都对我不起作用!在整整2天的互联网上上下寻找之后,我找到了解决方案!!
假设您在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)

相关问题