我想按两列排序,一列是DateTime(updated_at
),另一列是Decimal(Price)
我希望能够先按updated_at排序,然后,如果同一天发生多个项目,请按价格排序。
我想按两列排序,一列是DateTime(updated_at
),另一列是Decimal(Price)
我希望能够先按updated_at排序,然后,如果同一天发生多个项目,请按价格排序。
Answers:
在Rails 4中,您可以执行以下操作:
Model.order(foo: :asc, bar: :desc)
foo
并且bar
是数据库中的列。
Thing.find(:all, :order => "updated_at desc, price asc")
会成功的
Thing.all.order("updated_at DESC, price ASC")
是Rails 3要走的路。(感谢@cpursley)
Thing.all.order("updated_at DESC, price ASC")
Thing.order("LOWER(name), number")
。
Active Record查询接口使您可以指定要订购查询的属性数量:
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)
model
改为,models
以便一个人知道它是多元的。只是一个建议。
:asc
改为asc
:Model.order({price: :desc}, {date: :desc}, {price: :asc})
实际上,有许多方法可以使用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 Engine也可以做到这一点
Model.order(foo: :asc).order(:bar => :desc).order(:etc)
?SQL中的order子句的顺序与运行该语句时的顺序相反.to_sql
。
这些都不对我有用!经过整整两天的互联网搜寻,我找到了解决方案!
假设您在产品表中有很多列,包括:special_price和msrp。这是我们试图进行排序的两列。
好的,首先在模型中添加以下行:
named_scope :sorted_by_special_price_asc_msrp_asc, { :order => 'special_price asc,msrp asc' }
其次,在产品控制器中,添加您需要执行搜索的位置:
@search = Product.sorted_by_special_price_asc_msrp_asc.search(search_params)
:order => ["DATE(#{table_name}.updated_at)", :price]
请注意,这:price
是一个符号。)