Rails Active Record选择父和子作为一个结果

时间:2012-07-24 19:12:36

标签: 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" = "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

显然,这会使页面加载时间非常可怕,因为它必须循环遍历每个页面并拉出父对象。

我尝试了一些事情,例如

> Alert.joins(:polling).where(...)
> Alert.includes(:polling).where(...)
> Alert.joins(:polling).select('*').where(...)

每次访问我的索引页面时,我都会收到两个不同的查询。每个Alert一个,然后另一个获取其父数据。如何在一行上执行此操作,以便在我提取警报时,我还可以获取其关联的父数据?似乎没有办法从另一端开始,因为如果我做了Pollings.where(...),它就不会把孩子当作一个群体来抓住。

1 个答案:

答案 0 :(得分:2)

如果要详细指定SQL,可以随时尝试find方法传递:include,:join,:where等includesjoins做同样的事情。当您尝试访问数据但Activerecord的行为不同时。例如,按照3种方式设置对象数组,但它们是不同的。

[1]

alerts = Alert.joins(:polling)

[2]

alerts = Alert.includes(:polling)

[3]

alerts = Alert.find(:all, :includes => :polling, :joins => :polling)

当你做

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

您可以看到activerecord如何尝试从数据库或缓存中获取数据。我认为,[3]方式只会在其他人抛出多个查询时抛出一个查询。