快速分析正在发生的情况,因为它将帮助您了解如何处理替换查询。
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
属性已加载,可供您使用。
Next,
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"]
Finally,
Product.where(visible: true, id: product_ids).order(sort_product_ids.join(', '))
选择全部Products
列所在的位置visible
is true
,以及他们的id
是在数组中product_ids
(正如我们之前发现的,它实际上是一个数组Demo
对象,而不是整数 - 这可能会导致查询失败)。然后,它要求 SQL 按以下顺序对该结果列表进行排序:sort_product_ids
(作为字符串发送"id = 1, id = 2, ... id = 10"
而不是数组["id = 1", "id = 2", ... "id = 10"]
).
更多信息请访问:http://guides.rubyonrails.org/active_record_querying.html http://guides.rubyonrails.org/active_record_querying.html
http://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html http://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html