[英]Rails - how to convert output of find_by_sql (array) to an ActiveRecord relation?
我需要运行一个复杂的 SQL 查询,因为我不知道如何使用 ActiveRecod 构造查询,所以我不得不使用原始 SQL 查询来使用find_by_sql
:
scope :get_cars, -> do
find_by_sql('select * from
(SELECT cars.*,
manufacturer.company_name AS manufacturer_company_name,
services.a_num AS service_a_num,
(SELECT car_documents.file_url FROM car_documents
WHERE car_documents.car_id = cars.id AND car_documents.doc_type = 1 LIMIT 1) AS doc1_file_url,
(SELECT car_documents.file_s3_url FROM car_documents
WHERE car_documents.cart_id = cars.id AND car_documents.doc_type = 3 LIMIT 1) AS file_inv,
(SELECT car_data.demand_lvl FROM car_data
WHERE car_data.car_id = cars.id) AS demand_lvl,
(SELECT car_logs.invoice FROM car_logs
WHERE car_logs.car_id = cars.id AND car_logs.invoice = 1 LIMIT 1) AS invoice_sent
FROM "cars"
INNER JOIN "services" ON "services"."id" = "cars"."service_id"
LEFT JOIN manufacturers ON manufacturers.id = cars.manufacturer_id
WHERE (cars.status_id != 6
AND cars.delivery_date < NOW() - INTERVAL \'15 days\'
) ORDER BY cars.pickup_date ASC) t
Where doc1_file_url IS NULL OR file_inv IS NULL OR invoice_sent IS NULL')
end
output 是一个数组。 如何将此数组转换为 ActiveRecord object? 或者可能,有什么解决方法吗?
我认为,您可以使用 Active Record 接口中的from()
方法。 您可以在from()
方法的帮助下将子查询用作 SQL select 语句的表。 检查下面的例子。 这样,您将获得活动记录 object。
subquery = Setting.limit(10)
Setting.from("(#{subquery.to_sql}) settings")
在你的情况下,
subquery = "(SELECT cars.*,
manufacturer.company_name AS manufacturer_company_name,
services.a_num AS service_a_num,
(SELECT car_documents.file_url FROM car_documents
WHERE car_documents.car_id = cars.id AND car_documents.doc_type = 1 LIMIT 1) AS doc1_file_url,
(SELECT car_documents.file_s3_url FROM car_documents
WHERE car_documents.cart_id = cars.id AND car_documents.doc_type = 3 LIMIT 1) AS file_inv,
(SELECT car_data.demand_lvl FROM car_data
WHERE car_data.car_id = cars.id) AS demand_lvl,
(SELECT car_logs.invoice FROM car_logs
WHERE car_logs.car_id = cars.id AND car_logs.invoice = 1 LIMIT 1) AS invoice_sent
FROM "cars"
INNER JOIN "services" ON "services"."id" = "cars"."service_id"
LEFT JOIN manufacturers ON manufacturers.id = cars.manufacturer_id
WHERE (cars.status_id != 6
AND cars.delivery_date < NOW() - INTERVAL \'15 days\'
) ORDER BY cars.pickup_date ASC)"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.