簡體   English   中英

Rails - 如何將 find_by_sql (數組)的 output 轉換為 ActiveRecord 關系?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM