Ruby on rails ActiveRecord自动覆盖特定选定的字段
我有以下代码:Ruby on rails ActiveRecord自动覆盖特定选定的字段,ruby-on-rails,ruby,postgresql,activerecord,ruby-on-rails-5,Ruby On Rails,Ruby,Postgresql,Activerecord,Ruby On Rails 5,我有以下代码: 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
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)
只是一个随机条件,在prod it中
将筛选出不属于该用户但不属于该用户的P
与问题完全相关,因此我可以确认ActiveRecord将作为子查询运行它。我还重新命名了
将模型转换为L和P以混淆我的项目。我也知道总数
我的select中的函数不是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\u load
而不是联接
?因为它们不包括在聚合函数或group by中,SQL将无法执行。渴望的负载给我一个左外连接,而一个连接给我一个内连接。