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」的字段以及我的具體選擇。我怎麼能阻止它做到這一點?
爲什麼當Rails的選擇更多的列的問題嗎?你爲什麼使用'eager_load'而不是'joins'? – spickermann
由於它們未包含在聚合函數或組合中,SQL將無法執行。 Eager_load給了我LEFT OUTER JOIN,而一個連接會給我一個INNER JOIN。 – Ash