gpt4 book ai didi

ruby-on-rails - 按 ActiveRecord 中的特定 id 排序

转载 作者:行者123 更新时间:2023-12-03 00:24:28 25 4
gpt4 key购买 nike

我继承了另一个程序员的Rails3项目,总体来说我对rails还很陌生。他有一个似乎按特定 ID 排序的查询。有人能解释一下这在实际的 SQL 中是如何解决的吗?我认为这段代码正在杀死数据库以及随后的 Rails。我尝试在记录器中输出它,但即使将配置设置为: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}"}   

生成映射到格式“id = x”的product_ids集合。 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(', '))

选择 visible 列为 true 且其 id 位于 数组中的所有 Products code>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://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html

关于ruby-on-rails - 按 ActiveRecord 中的特定 id 排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18991797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com