按ActiveRecord中的特定ID排序

我inheritance了另一个程序员的Rails3项目,而且我对rails总体来说相当新。 他有一个看起来按特定id排序​​的查询。 有人可以解释这在实际的SQL中是如何解决的吗? 我认为这段代码正在杀死db并随后使用rails。 我试图在记录器中输出它,但是即使将config设置为:debug也似乎无法获得实际的SQL输出。 在这里大量搜索(在SO上)没有清楚地解释这个查询的外观。 代码如下:

options = { select: "SUM(1) AS num_demos, product_id ", group: "product_id", order: "num_demos ASC", } product_ids = Demo.where("state = 'waitlisted'").find(:all, options).collect{|d| d.product_id} sort_product_ids = product_ids.collect{|product_id| "id = #{product_id}"} Product.where(visible: true, id: product_ids).order(sort_product_ids.join(', ')) 

据我所知,最后一行将使用ORDER BY“id = 1,id = 3,…”等对产品表创建一个查询,这对我来说没有多大意义。 所有线索都表示赞赏。

快速分析正在发生的事情,因为它可以帮助您了解如何为替换查询做些什么。

 options = { select: "SUM(1) AS num_demos, product_id ", group: "product_id", order: "num_demos ASC", } product_ids = Demo.where("state = 'waitlisted'").find(:all, options).collect{|d| d.product_id} 

这条线将生成

 SELECT SUM(1) as num_demos, product_id FROM "demos" WHERE (state = 'waitlisted') GROUP BY product_id 

并返回一个Demo对象数组,按组中行的count(*)排序,其中只加载了product_id属性,并且可供您使用。

下一个,

 sort_product_ids = product_ids.collect{|product_id| "id = #{product_id}"} 

导致product_ids的集合映射到格式"id = x" 。 IE:如果前一个结果返回10个结果,product_ids范围为1..10,则sort_product_ids现在相当于["id = 1", "id = 2", "id = 3", "id = 4", "id = 5", "id = 6", "id = 7", "id = 8", "id = 9", "id = 10"]

最后,

 Product.where(visible: true, id: product_ids).order(sort_product_ids.join(', ')) 

选择列visibletrue所有Products ,并且它们的idproduct_ids数组中(正如我们之前发现的那样,它实际上是一个Demo对象数组,而不是整数 – 这可能导致查询失败)。 然后,它要求SQL按sort_product_ids对结果列表进行排序(以字符串forms"id = 1, id = 2, ... id = 10"而不是数组["id = 1", "id = 2", ... "id = 10"] )。

更多信息请访问: http : //guides.rubyonrails.org/active_record_querying.html http://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html

要按给定的ID数组进行选择和排序,您可以使用它

 Product.where(visible: true, id: product_ids) .order( "field(id,#{product_ids.join(',')})" )