6

我的申请中有父/子关系

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(...)

每次访问索引页面时都会收到两个不同的查询。一个用于每个警报,然后另一个用于获取其父数据。我怎样才能在一行上做到这一点,以便当我拉警报时,我也能得到它们相关的父数据?似乎没有办法从另一端解决它,因为如果我这样做,Pollings.where(...)它不会把孩子们作为一个群体来抓。

4

1 回答 1

3

如果你想详细指定 SQL,你总是可以尝试find传递 :include、:joins、:where 等方法,includes或者joins当你尝试访问数据但 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] 方式在其他人抛出多个查询时只抛出一个查询。

于 2012-07-24T20:06:49.030 回答