Ora*_*s13 6 activerecord ruby-on-rails nested-attributes
我的申请中有父/子关系
class Polling
has_many :alerts, :dependent => :destroy
class Alert
belongs_to :polling
Run Code Online (Sandbox Code Playgroud)
在我的警报索引页面上,我需要显示每个父项的一些数据,这会产生两个查询
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
Run Code Online (Sandbox Code Playgroud)
显然,这会使页面加载时间非常可怕,因为它必须遍历每个页面并拉动父对象.
我尝试过一些东西,比如
> Alert.joins(:polling).where(...)
> Alert.includes(:polling).where(...)
> Alert.joins(:polling).select('*').where(...)
Run Code Online (Sandbox Code Playgroud)
每当我访问索引页面时,每次收到两个不同的查询.每个Alert一个,然后另一个获取其父数据.如何在一行上执行此操作,以便在我提取警报时,我还可以获取其关联的父数据?从另一端似乎没有办法解决这个问题,因为如果我这样做Pollings.where(...)
,就不会把孩子当成一个群体.
如果你想详细指定 SQL,你总是可以尝试find
传递 :include、:joins、:where 等方法,includes
或者joins
当您尝试访问数据但 activerecord 的行为不同时执行相同的操作。例如,以下三种方式设置对象数组,但它们是不同的。
[1]
alerts = Alert.joins(:polling)
Run Code Online (Sandbox Code Playgroud)
[2]
alerts = Alert.includes(:polling)
Run Code Online (Sandbox Code Playgroud)
[3]
alerts = Alert.find(:all, :includes => :polling, :joins => :polling)
Run Code Online (Sandbox Code Playgroud)
当你这样做时
alerts.each do |alert|
alert.pollings.each do |polling|
p polling
end
end
Run Code Online (Sandbox Code Playgroud)
您可以看到 activerecord 如何尝试从数据库或缓存获取数据。我认为,[3] 方式在其他方式引发多个查询时仅引发一个查询。
归档时间: |
|
查看次数: |
2416 次 |
最近记录: |