急切的装载没有装入铁轨

嗨,我在这里错过了什么? 我阅读了有关加载加入的文档,并尝试了以下内容。 您可以看到,当我使用“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 => [#]