急切的装载没有装入铁轨
嗨,我在这里错过了什么? 我阅读了有关加载加入的文档,并尝试了以下内容。 您可以看到,当我使用“include”时,包含的连接不会输出所需的数据,但是当我在事后显式调用连接模型时,您可以看到有所需的数据。 以下是我在IRB中的模型和行为:
class Appearance < ActiveRecord::Base belongs_to :photo belongs_to :person end class Photo :appearances end class PhotosController [:people, :appearances]) Photo Load (0.4ms) SELECT `photos`.* FROM `photos` WHERE `photos`.`id` = 51941 LIMIT 1 Appearance Load (0.3ms) SELECT `appearances`.* FROM `appearances` WHERE `appearances`.`photo_id` IN (51941) ORDER BY position Person Load (0.2ms) SELECT `people`.* FROM `people` WHERE `people`.`id` IN (12103) => # 1.9.3p194 :036 > Photo.find(51941).appearances Photo Load (0.4ms) SELECT `photos`.* FROM `photos` WHERE `photos`.`id` = 51941 LIMIT 1 Appearance Load (0.4ms) SELECT `appearances`.* FROM `appearances` WHERE `appearances`.`photo_id` = 51941 ORDER BY position => [#]
我认为你误解了includes
。 使用includes
(或查找的include
选项)告诉rails在加载父进程的同时从DB加载关联。 这可以在您的IRB会话中进行,您可以从以下两行中看到:
Appearance Load (0.3ms) SELECT `appearances`.* FROM `appearances` WHERE `appearances`.`photo_id` IN (51941) ORDER BY position Person Load (0.2ms) SELECT `people`.* FROM `people` WHERE `people`.`id` IN (12103)
将find
结果输出到控制台时没有看到关联记录的事实只是inspect
方法的结果,它不会(默认情况下)显示所有关联的数据(通常会是大量的数据)。
当您输入Photo.find(51941).appearances
您正在检查的不是照片而是外观关联(数组),这就是您可以在IRB控制台中查看结果的原因。
如果您想测试include
是否有效,请先将照片分配给变量:
photo = Photo.find(51941, :include => [:people, :appearances]) Photo Load (0.4ms) SELECT `photos`.* FROM `photos` WHERE `photos`.`id` = 51941 LIMIT 1 Appearance Load (0.3ms) SELECT `appearances`.* FROM `appearances` WHERE `appearances`.`photo_id` IN (51941) ORDER BY position Person Load (0.2ms) SELECT `people`.* FROM `people` WHERE `people`.`id` IN (12103)
您应该看到SQL语句不仅适用于照片,还适用于相关人员和外观。 这表明rails已经急切地加载了这些关联。
如果您随后获得了与photo.appearances
的关联,并且您不应该看到任何SQL查询,因为该关联已经从DB加载:
1.9.3p194 :036 > photo.appearances => [#]
如果你没有使用include
,你会在结果之前看到一个SQL查询:
1.9.3p194 :036 > photo.appearances Appearance Load (0.3ms) SELECT `appearances`.* FROM `appearances` WHERE `appearances`.`photo_id` IN (51941) ORDER BY position => [#]