Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.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 Rails活动记录选择父项和子项作为一个结果_Ruby On Rails_Activerecord_Nested Attributes - Fatal编程技术网

Ruby on rails Rails活动记录选择父项和子项作为一个结果

Ruby on rails Rails活动记录选择父项和子项作为一个结果,ruby-on-rails,activerecord,nested-attributes,Ruby On Rails,Activerecord,Nested Attributes,我的申请中有父母/子女关系 class Polling has_many :alerts, :dependent => :destroy class Alert belongs_to :polling 在我的警报索引页面上,我需要显示来自每个父级的一些数据,这将导致两个查询 Alert Load (6.1ms) SELECT * FROM (SELECT * FROM "ALERTS" INNER JOIN "POLLINGS" ON "POLLINGS"."ID" = "ALE

我的申请中有父母/子女关系

class Polling
 has_many :alerts, :dependent => :destroy

class Alert
 belongs_to :polling
在我的警报索引页面上,我需要显示来自每个父级的一些数据,这将导致两个查询

Alert Load (6.1ms)  SELECT * FROM (SELECT * FROM "ALERTS" INNER JOIN "POLLINGS" ON "POLLINGS"."ID" = "ALERTS"."POLLING_ID" ORDER BY "ALERTS"."ID" DESC) WHERE ROWNUM <= 1
Polling Load (1.8ms)  SELECT "POLLINGS".* FROM "POLLINGS" WHERE "POLLINGS"."ID" = 10113 AND ROWNUM <= 1

每次我访问索引页面时,都会收到两个不同的查询。一个用于每个警报,然后另一个用于获取其父数据。如何在一行上执行此操作,以便在提取警报时也能获取其关联的父数据?似乎没有办法从另一端开始,因为如果我进行
轮询。其中(…)
它不会将子对象作为一个组进行抓取。

如果您想详细指定SQL,您可以尝试
查找
方法传递:include,:joins,:其中etc.
包括
连接
在您尝试访问数据时执行相同的操作,但activerecord的行为不同。例如,以下三种方法设置对象数组,但它们是不同的

[1]

[2]

[3]

当你这样做的时候

alerts.each do |alert|
  alert.pollings.each do |polling|
    p polling
  end
end

您可以看到activerecord如何尝试从DB或缓存获取数据。我相信[3]方法只抛出一个查询,而其他方法抛出多个查询。

使用includes方法肯定是正确的。另一个角度是尝试轮询。包括(:警报)。其中(…)。你能发布你的视图代码吗?问题是我们必须从子端开始,而不是从父端。你不想预加载吗?我发现,即使我使用连接执行Alert.find,如果我使用Alert.pollings,它仍然会从数据库中分别提取这些内容,因此这就是导致它仍然执行附加查询的原因。最后,我也使用了.select()并按预期执行了alert.polling\u字段。很奇怪,但它是有效的。
alerts = Alert.joins(:polling)
alerts = Alert.includes(:polling)
alerts = Alert.find(:all, :includes => :polling, :joins => :polling)
alerts.each do |alert|
  alert.pollings.each do |polling|
    p polling
  end
end