【发布时间】:2015-05-21 18:38:11
【问题描述】:
我需要帮助来将此 SQL 转换为 ActiveRecord 查询。
SELECT
MAX(total_sales.start_date) AS maximum_start_date,
customers.external_id, product_categories.external_id AS product_category_id
FROM
total_sales
INNER JOIN
customers
ON
customers.id = total_sales.customer_id
LEFT JOIN
product_categories
ON
product_categories.id = total_sales.product_category_id
WHERE
(customers.organization_id = 1)
GROUP BY
customers.external_id,
product_categories.external_id
我试过了
TotalSales.joins(:customer).includes(:product_category).
where("customers.organization_id = ?", 1).
group("customers.external_id, product_categories.external_id").
maximum(:start_date)
它几乎可以生成我想要的查询。这是它生成的:
SELECT
MAX("total_sales"."start_date") AS maximum_start_date,
customers.external_id, product_categories.external_id AS customers_external_id_product_categories_external_id
FROM
"total_sales"
INNER JOIN "customers" ON
"customers"."id" = "total_sales"."customer_id"
LEFT OUTER JOIN "product_categories" ON
"product_categories"."id" = "total_sales"."product_category_id"
WHERE
(customers.organization_id = 1)
GROUP BY
customers.external_id, product_categories.external_id
但这会在 Rails 上返回:
=> {"DIA"=>Wed, 01 Jan 2014, "MES"=>Wed, 01 Jan 2014, nil=>Wed, 01 Jan 2014}
如果我在数据库控制台上运行该查询,它会返回
"2014-01-01";"CLIENTE.1";"DIA"
"2014-01-01";"CLIENTE.1";"MES"
"2014-01-01";"CLIENTE.1";""
"2014-01-01";"CLIENTE.10";"DIA"
"2014-01-01";"CLIENTE.10";"MES"
"2014-01-01";"CLIENTE.10";""
"2014-01-01";"CLIENTE.100";"DIA"
"2014-01-01";"CLIENTE.100";"MES"
...
这就是我想要的。在 DB 控制台上它可以工作,但在 Rails 上却不行。 :(
【问题讨论】:
-
这是一个工作查询的示例:sqlfiddle.com/#!9/7a6d1/1/0。这在 Rails 上不起作用..
-
猜测是 OUTER LEFT JOIN 与 LEFT JOIN 产生了这种行为。看:stackoverflow.com/questions/8025429/… 还看:codeproject.com/Articles/33052/… 一种方法可能是删除 where 并在获取记录后进行过滤,具体取决于记录集大小
-
带有或不带有 OUTER 的查询都会在 DB 控制台上产生所需的输出。似乎问题在于 AR 如何在哈希上对其进行转换。
-
我相信这与两个按列分组具有相同名称的事实有关..
标签: ruby-on-rails ruby postgresql ruby-on-rails-4 activerecord