Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails ActiveRecord自动覆盖特定选定的字段_Ruby On Rails_Ruby_Postgresql_Activerecord_Ruby On Rails 5 - Fatal编程技术网

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将无法执行。渴望的负载给我一个左外连接,而一个连接给我一个内连接。