2012-09-03 44 views
0

你好我错过了什么吗?我阅读了关于加载加载的文档,并尝试了下面的内容。您可以看到,当我使用“include”时,包含的联接不会输出所需的数据,但是当我在事实之后显式调用联接模型时,可以看到存在所需的数据。下面是我的模型和行为IRB:Eager loading未载入导轨

class Appearance < ActiveRecord::Base 
    belongs_to :photo 
    belongs_to :person 
end 


class Photo < ActiveRecord::Base 
    belongs_to :event 
    has_many :appearances, order: 'position' 
    has_many :people, :through => :appearances 
end 


class PhotosController < ApplicationController 
    def index 
    @event   = Event.find(params[:event]) 
    @photos   = @event.photos.includes(:people, :appearances) 
    # this does not show any appearance records, however this does 
    # @photos   = @event.photos.first.people 
    end 
end 

#IN IRB 
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) 

=> #<Photo id: 51941, time_created: "165732-0500", copyright_notice: "", country_primary_location_name: "", date_created: "20110119", created_at: "2011-01-20 07:33:24", updated_at: "2011-01-20 21:17:41", event_id: 602, position: 102, visible: nil, filename: "RAS_4824.JPG", folder: "", image: nil, image_file_name: nil, image_content_type: nil, image_file_size: nil, image_updated_at: nil> 

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 
=> [#<Appearance id: 73654, photo_id: 51941, person_id: 12103, created_at: "2011-01-20 07:33:24", updated_at: "2011-01-20 07:33:24", position: 1>] 

回答

1

我想你误解的includes点。使用includes(或include选项查找)告诉导轨在加载父节点的同时从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查询,因为联想已经从数据库加载:

1.9.3p194 :036 > photo.appearances 
=> [#<Appearance id: 73654, photo_id: 51941, person_id: 12103, created_at: "2011-01-20 07:33:24", updated_at: "2011-01-20 07:33:24", position: 1>] 

如果你有使用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 
=> [#<Appearance id: 73654, photo_id: 51941, person_id: 12103, created_at: "2011-01-20 07:33:24", updated_at: "2011-01-20 07:33:24", position: 1>] 
+0

是啊,我明白了。我的问题是我想要所有的数据准备好并且使用JSON。我最终做的是: photos.to_json(:include => { :appearances => {:include => {:person}}}) 感谢您的帮助! – jdkealy