对于“急切加载”,您使用.include
; .join
用于执行 INNER JOIN 功能。对于您的情况,您似乎可能会同时使用两者(加入获取照片,包含获取更多人)。我提出这一点是因为.join
单独不会执行急切加载(因此它会在访问关联实体时进行查询)。
如果您希望预先加载嵌套关联,可以使用http://guides.rubyonrails.org/active_record_querying.html#eager-loading-multiple-associations上的 Ruby on Rails 指南中概述的语法
这些方面的东西会起作用吗?
Photo.joins(:appearances => :person).includes(:appearances => :person).limit(5)
还是你需要从人开始?
Person.joins(:appearances => :photo).includes(:appearances => :photo => :appearaces => :person).limit(5)
另外,作为最后(小)注意事项:您的最后一行代码中的“:appearances”拼写错误(它表示“:appearaces”),这可能会导致问题。
编辑:
经过一些小测试后,似乎将包含关联嵌套在
a => b => c => b => a
表格不起作用。但是,以下表格可以:
a => [b => [c => [b => a]]]
虽然,当然,它并不那么漂亮。
意思是,使用以下代码:
Person.includes(:appearances => [:photo => [:appearances => :person]]).find(38)
生成了以下 SQL:
Person Load (0.3ms) SELECT `persons`.* FROM `persons` WHERE `persons`.`id` = 38 LIMIT 1
Appearance Load (0.3ms) SELECT `appearances`.* FROM `appearances` WHERE (`appearances`.person_id = 38)
Photo Load (0.3ms) SELECT `photos`.* FROM `photos` WHERE (`photos`.`id` = 1904)
Appearance Load (0.3ms) SELECT `appearances`.* FROM `appearances` WHERE (`appearances`.photo_id = 1904)
Person Load (0.3ms) SELECT `persons`.* FROM `persons` WHERE (`persons`.`id` IN (38,346))
渴望从所有包含 id #38 的人的照片中加载额外的人