2012-03-14 33 views
2

如何貪婪加載這些協會預先加載一個查詢對於同一型號的兩個協會

class Pair < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :buddy, :class_name => "User" 
end 


class PairsController < ApplicationController 
    def show 
    @pair = Pair.includes(:user, :buddy).find(params[:id]) 
    end 
end 

查詢如下:

一對負載(3.1毫秒)選擇pairs * FROM。 pairs WHERE pairsid = 935029848限制1

用戶負載(4.3ms)SELECT users.id從users其中usersid IN(965902799)

用戶負載(0.9ms)SELECT users.id FROM users WHERE usersid IN(274512568)

,但我想:

一對負載(3.1毫秒)選擇pairs * FROM pairs WHERE pairsid = 935029848 LIMIT 1

用戶負載(4.3ms)SELECT users.id FROM users WHERE usersid IN(965902799,274512568)

+0

是不是'選擇users.id來自用戶的WHERE users.id(1)'和'選擇users.id來自用戶的WHERE users.id(2)'相同作爲'SELECT users.id FROM users WHERE users.id IN(1,2)'?這兩種情況下都會產生用'id' 1和2的用戶。我沒有得到區別。 – prasvin 2012-03-14 08:37:48

回答

0

嘗試@pair = Pair.joins(:user, :buddy).find(params[:id])

+0

它返回下面的查詢,並且不急於加載: >一對載荷(0.4ms)SELECT'pairs' * FROM'pairs' INNER JOIN'users' ON'users'.'id' ='pairs'.'。 user_id' INNER JOIN''users' ON buddies_pairs''buddies_pairs'.'id' ='pairs'.'buddy_id' – mitsuki 2012-03-14 08:41:27

+0

嘗試添加'包括(:用戶:哥們)'後加入 – Hck 2012-03-14 08:46:28

+0

哇!它返回一個查詢!但查詢時間太長。有沒有其他的問題,當我請求許多 '對' 與_ 「@對= Pair.where(:USER_ID => PARAMS [:ID])_」? – mitsuki 2012-03-14 09:08:47

1

我認爲你不能做,在軌現在,因爲默認情況下軌假定不同的協會有不同的表,它不能結合即使這些關聯具有相同的表格,也可以在加載時加入不同的關聯到一個查詢中。另外,我認爲這樣做甚至是不可行的,因爲如果你考慮一下你的數據關係:你試圖爲一個Pair加載User和Buddy,當你用2個查詢來做它時,它很漂亮直截了當,你知道誰是用戶和誰是好友,但想一下當你用1個查詢做的情況下,你如何知道檢索到的記錄是用戶還是好友?沒有辦法知道這100%。

+0

嗯...然後我會找到其他方式。謝謝! – mitsuki 2012-03-17 05:44:09

0

我相信你可以做到這一點。您可以在執行ActiveRecord查找時分別使用:include參數(Rails 2)或包含方法(Rails 3)。以下是加載與博客帖子相關聯的兩個模型的示例:標籤和評論。評論也有一個嵌套的評論者:

# Rails 2 
Blogpost.all(:include => [:tags, { :comments => :commenter }]) 

# Rails 3 
Blogpost.includes(:tags, { :comments => :commenter }).all