【问题标题】:Rails - how to convert output of find_by_sql (array) to an ActiveRecord relation?Rails - 如何将 find_by_sql (数组)的输出转换为 ActiveRecord 关系?
【发布时间】:2021-01-21 14:37:36
【问题描述】:

我需要运行一个复杂的 SQL 查询,因为我不知道如何使用 ActiveRecod 构造查询,所以我不得不通过 find_by_sql 使用原始 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

输出是一个数组。如何将此数组转换为 ActiveRecord 对象?或者可能,有什么解决方法吗?

【问题讨论】:

  • 将其转换为 AR 查询将变得容易得多,并且不那么 hacky,然后反过来。为了帮助您完成我们需要您的模型和架​​构示例。

标签: sql ruby-on-rails activerecord


【解决方案1】:

我认为,您可以使用 Active Record 接口中的from() 方法。您可以借助from() 方法将子查询用作SQL 选择语句的表。检查下面的例子。这样就得到了活动记录对象。

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)"

【讨论】:

    猜你喜欢
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多