2017-06-21 50 views
0

我有以下代碼:ActiveRecord的自動中重寫特別選定的領域

L.select('"l"."id", "ps"."name", "ps"."proposed_start", "ps"."proposed_finished", COUNT(*) as total, SUM(EXTRACT(EPOCH FROM ("l"."stop_at" - "l"."start_at"))) as duration, COUNT(CASE WHEN "l"."stop_at" IS NULL THEN 1 ELSE NULL END) as ongoing'). 
    where(p_id: P.where.not(name: nil).select(:id)). 
    eager_load(:p). 
    group('"l"."id"') 

注:P.where.not(name: nil)只是一個隨機的條件下,督促其 會被過濾掉P公司不屬於用戶,但它不是 完全相關的問題,它的存在,所以我可以確認的ActiveRecord將運行它作爲一個子查詢。我還將 模型更名爲L和P以混淆我的項目。另外我知道在我選擇的聚合函數 不是SQL不可知的,我正在使用Postgresql。

然而,當我運行.to_sql檢查什麼導致SQL的ActiveRecord會產生我發現我的沮喪,我結束了:

SELECT "l"."id", 
     "p"."name", 
     "p"."proposed_start", 
     "p"."proposed_finished", 
     Count(*)             AS total, 
     Sum(Extract(epoch FROM ("l"."stop_at" - "l"."start_at"))) AS duration, 
     Count(CASE 
       WHEN "l"."stop_at" IS NULL THEN 1 
       ELSE NULL 
      END)             AS ongoing, 
     "l"."id"             AS t0_r0, 
     "l"."p_id"             AS t0_r1, 
     "l"."user_id"            AS t0_r2, 
     "l"."start_at"            AS t0_r3, 
     "l"."stop_at"            AS t0_r4, 
     "l"."comment"            AS t0_r5, 
     "l"."created_at"           AS t0_r6, 
     "l"."updated_at"           AS t0_r7, 
     "l"."deleted_at"           AS t0_r8, 
     "l"."deleted_by_id"           AS t0_r9, 
     "p"."id"             AS t1_r0, 
     "p"."name"             AS t1_r1, 
     "p"."approved_by_id"          AS t1_r2, 
     "p"."user_id"            AS t1_r3, 
     "p"."proposed_start"          AS t1_r4, 
     "p"."proposed_finished"          AS t1_r5, 
     "p"."created_at"           AS t1_r6, 
     "p"."updated_at"           AS t1_r7, 
     "p"."p_status_id"           AS t1_r8, 
     "p"."approved_at"           AS t1_r9, 
     "p"."sub_unit_id"           AS t1_r10, 
     "p"."details"            AS t1_r11, 
     "p"."archived_at"           AS t1_r12, 
     "p"."archived_by_id"          AS t1_r13 
FROM "l" 
     LEFT OUTER JOIN "p" 
        ON "p"."id" = "l"."p_id" 
WHERE "l"."deleted_at" IS NULL 
     AND "l"."p_id" IN (SELECT "p"."id" 
          FROM "p" 
          WHERE ("p"."name" IS NOT NULL)) 
GROUP BY "l"."id" 

正如你可以看到,ActiveRecord的是自動選擇所有的連接表「p」的字段以及我的具體選擇。我怎麼能阻止它做到這一點?

+0

爲什麼當Rails的選擇更多的列的問題嗎?你爲什麼使用'eager_load'而不是'joins'? – spickermann

+0

由於它們未包含在聚合函數或組合中,SQL將無法執行。 Eager_load給了我LEFT OUTER JOIN,而一個連接會給我一個INNER JOIN。 – Ash

回答

1

的問題是這似乎亂加相關模型的所有領域,而忽略你的「選擇」 eager_load。如果將其更改爲加入INNER JOIN而不是LEFT OUTER JOIN,則它會接受您的選擇並按預期工作。