2012-09-03 48 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