2013-07-02 80 views
0

我知道如何加載,並且我已經在Google和StackOverflow中搜索了其他急切的加載問題。其中一些是啓發性的,但沒有解決我的特殊問題,所以我會自己去問一個問題。如何在加載父對象後急切加載關聯?

這裏是我的架構:

class Organization < ActiveRecord::Base 
    has_many :activities 
    has_many :users_logged, source: :user, through: :activities 
end 

class Activity < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :organization 
end 

class User < ActiveRecord::Base 
    has_many :activities 
end 

該項目繼承,我不能做任何重大的架構重新設計,所以如果這個問題是不可能的架構那就這樣吧。我只是想嘗試和加快新一代這些報告涉及加載所有的組織,是這樣的:

Organizations.includes(:users_logged).joins(:activities) 

現在,我意識到這裏說的includes(:users_logged)將加載的所有活動,但joins(:activities)仍然是必要的根據我排除的排序/分組字段,因爲它們對問題不重要。

現在的問題是,我希望加載所有已被includes(:users_logged)指令選中的用戶的所有活動,因爲我不僅需要組織詳細信息,相關活動以及所有已記錄活動的用戶爲組織。除此之外,我還需要爲用戶加載所有活動(理想情況下與組織關聯,但我可以在找出如何加載時加以解決)。

我目前的執行情況:

@orgs = Organization.includes(:users_logged).joins(:activities).all 
@orgs.each do |org| 
    org.users_logged.each do |user| 
    # Just work with user.activities 
    end 
end 

這樣每個用戶產生一個查詢,平均0.3 ms與相當迅速增加測試數據的電流量。有沒有辦法爲一組用戶加載所有活動?

+1

您是否嘗試過'Organization.includes(:users_logged =>:activities).joins(:activities).all'? – Baldrick

+0

我沒有,但我會。 –

+0

@Baldrick Nope,控制檯的結果相同。仍然提出個別要求。 –

回答

0

我發佈了這個答案,以確保它清楚它已被解決。一旦我有能力,我會接受這是正確的答案。

Baldrick的評論讓我想到我是如何過濾出用戶的活動,以便我只將活動記錄到活動組織中。我正在執行:

user.activities.where("organization_id = ?", org.id) 

無論我做了什麼,每次都會強制進行查詢。所以我把它改爲:

user.activities.select { |o| o.id == org.id } 

哪個現在執行我想要的(在@ Baldrick的推薦之後)。