Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails:如何使用ActiveRecord对两列进行排序?_Ruby On Rails - Fatal编程技术网

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

Ruby on rails RubyonRails:如何使用ActiveRecord对两列进行排序?,ruby-on-rails,Ruby On Rails,我想按两列排序,一列是日期时间(updated\u at),另一列是十进制(Price) 我想能够排序的第一个更新_在,然后,如果多个项目发生在同一天,排序的价格 Model.all(:order => 'updated_at, price') 我会成功的 更新: 还有3条路要走。(谢谢)假设您使用的是MySQL Model.all(:order => 'DATE(updated_at), price') 注意与其他答案的区别。updated\u at列将是一个完整的时间戳,因此

我想按两列排序,一列是日期时间(
updated\u at
),另一列是十进制(Price)

我想能够排序的第一个更新_在,然后,如果多个项目发生在同一天,排序的价格

Model.all(:order => 'updated_at, price')
我会成功的

更新:
还有3条路要走。(谢谢)

假设您使用的是MySQL

Model.all(:order => 'DATE(updated_at), price')
注意与其他答案的区别。
updated\u at
列将是一个完整的时间戳,因此如果您想根据更新日期进行排序,您需要使用一个函数从时间戳中仅获取日期部分。在MySQL中,即。

允许您为查询指定任意数量的属性:

models = Model.order(:date, :hour, price: :desc)
或者,如果您想更具体(谢谢):

奖励:在第一次查询之后,您可以链接其他查询:

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

在Rails 4中,您可以执行类似的操作:

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

foo
bar
是数据库中的列。

实际上,使用活动记录有很多方法。上述未提及的一种是(各种格式,均有效):

也许更冗长,但我个人觉得更容易管理。 SQL仅在一个步骤中生成:

SELECT "models".* FROM "models" ORDER BY "models"."etc" ASC, "models"."bar" DESC, "models"."foo" ASC
因此,对于原始问题:

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

您不需要声明数据类型,ActiveRecord可以顺利完成这项工作,您的DB引擎也可以顺利完成这项工作

所有这些都不适合我! 经过整整两天的互联网搜索,我找到了一个解决方案

假设产品表中有许多列,包括:特殊价格和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)

为了防止联接因“不明确的列”消息而随机中断,您应该使用以下更健壮的版本:
:order=>[“DATE({table_name}.updated_at)”,:price]
(注意,
:price
是一个符号。)我必须使用
order
这样来转义我的order列:
Model.all(:order=>“day asc,`order`asc”)
Thank you@Erik-我知道这个答案已经过时了,所以我要提醒现在看到它的人:从Rails 3.2开始,这个方法已经被弃用了。改为使用Thing.all=)正确,这对我来说很好:
Thing.all.order(“updated_at DESC,price ASC”)
当我需要将排序值小写时,您的更新对我很有帮助:
Thing.order(“LOWER(name),number”)
。Rails 4是最棒的。我知道这是一篇老文章,但是我个人会把
模型
改成
模型
,这样人们就会知道它是多元化的。只是一个建议。我想应该编辑一个更特别的例子:例如models=Model.order({price::desc},{date::desc},{price:asc})如果有人粘贴了这个,并看到未定义的方法错误,这里有一个小的输入错误。它应该是
:asc
而不是
asc
Model.order({price::desc},{date::desc},{price::asc})
如果使用两个不同表中的两列,例如:Member.includes(:voter.order(“town_club asc”)。order(“voctors.last_name asc”)发布的SQL是否对应于
Model.order(foo::asc).订单(:bar=>:desc).订单(:etc)
?SQL中order子句的顺序与我运行
时得到的顺序相反。@Qaz这是很久以前的事了。我想我可能需要纠正这一点,我从来没有注意到。我稍后再查。谢谢
SELECT "models".* FROM "models" ORDER BY "models"."etc" ASC, "models"."bar" DESC, "models"."foo" ASC
Model.order(:updated_at).order(:price)
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)