在哪一點上可以對大型項目進行所有查詢以加載所有對象關聯?
讓我來解釋一下這個問題的背景。
目前我正在研究一個在模型和關聯方面變得相當複雜的項目。我開始檢查服務器日誌,發現一些視圖需要一些時間來加載,因爲查詢中包含的嵌套對象。
所以我開始重構某些查詢的到這樣的事情:什麼時候Rails Eager默認加載所有關聯是一個好主意?
@process = current_account.processes.query(params)
要這樣:
@process = current_account.processes.includes(:messages, :parts, :people).query(params)
結果是相當不錯的。在某些視圖中,我能夠將視圖渲染時間和主動記錄查詢時間縮短70%。
我很高興的人,所以我決定做更多。但是在做出這個決定之後,我開始注意到並非所有地方都重構了代碼,這些變化都很好。事實上,有些查詢變得更慢。
要解釋一下關於這個問題我有這樣一個模型:
而且裏面process
belongs_to :user
創建它像這樣這些嵌套模式中的每一個:
class Anotation
belongs_to :user
class Reunion
belongs_to :user
class Profile
belongs_to :user
它去上。
在我的show view
的process
中,有幾個選項卡顯示這些嵌套對象的全部以及將其添加到當前進程的用戶的名稱。
有了這樣的查詢:
@process = current_account.processes.query(params)
它執行有點慢。所以,我想是這樣的:
@process = current_account.process.includes(:anotations, :publications, :movimentations,
:reunions, :profiles, :messages).query(params)
這使我獲得的視圖渲染速度,但在ActiveRecord的,在時間檢索這些對象已顯著上升。而且它提出的天空時,我渴望加載的process
所有嵌套模型這樣的內部user
對象:
@process = current_account.process.includes({:anotations => [:user]},
{:publications => [:user], etc...).query(params)
好,重構應用程序的設計,這些協會不同的行爲是不會發生的,所以我再問這個問題。
在哪一點很好,使大型項目上的所有查詢加載所有的對象關聯?
關於這個問題的任何提示/最佳實踐/經驗將非常感激。
我建議一個標題,如「什麼時候Rails加載默認情況下所有關聯都是一個好主意? – lulalala 2013-03-12 08:20:12