我似乎無法弄清楚爲什麼我的總渲染時間與我的生產日誌中列出的活動記錄時間+我的視圖時間不匹配。無法優化控制器中的Rails查詢
這裏是從我的生產日誌輸出:
完成200 OK在12508ms(瀏覽次數:0.3ms的| ActiveRecord的:46.0ms)
這裏是在我的控制器代碼:
store = Store.find(:vanity_url => params[:vanity_url])
render :json => store.get_pages_with_includes
return false
在我的Store.rb模型中,有兩種方法用於呈現模型的json表示及其所有活動關係。這裏是預先加載方法:
def eager_load_pages
pages = Page.where(:store_id => self.id).includes(
[{:menu_items =>
[
:sizes,
{:topping_groups =>
{:toppings => :sizes}
}
]
},
{:combos =>
{:combo_item_groups =>
{:combo_items =>
[
:sizes,
{:topping_groups =>
{:toppings => :sizes}
}
]
}
}
}]
).order('position ASC')
return pages
end
這裏是to_json方法
def get_pages_with_includes
pages = self.eager_load_pages
return pages.to_json({:include =>
[{:menu_items =>
{:include =>
{:topping_groups =>
{:include =>
{:toppings =>
{:include =>
:sizes
}
}
}
}
}
},
{:combos =>
{:include =>
{:combo_item_groups =>
{:include =>
{:combo_items =>
{:include =>
[:sizes, :topping_groups =>
{:include =>
{:toppings =>
{:include =>
:sizes
}
}
}
]
}
}
}
}
}
}]
})
end
所有代碼的工作,我不知道如果我能使其更有效率。我感到困惑的是爲什麼總頁面加載時間甚至不接近運行我的查詢所花費的時間。誰能幫我嗎?請??頁面在技術上應該在小於50毫秒的時間內加載,但其耗時12508毫秒!
任何幫助將不勝感激!
---------- UPDATE ------------ 我跑過了我的服務器,發現在這些查詢過程中,ruby佔用了100%的CPU。這裏有什麼想法?也許這指出了這個問題......?
此回覆非常翔實!謝謝你澄清!我將檢查multijson gem,因爲json是目前唯一的其他渲染。有沒有更好的方法來收集所有活躍的關係,並將它們發送到JavaScript的收藏視圖? –
數據庫檢索正常。只是一些不必要的返回語句請記住,如果沒有明確的返回值,Ruby方法將返回最後一條語句的值。因此'eager_load_pages'不需要變量賦值和返回語句。您可以查看'jbuilder'或類似的JSON視圖構建器,而不是使用大的'render'調用構建適當的視圖。但他們當然也會帶來一些小的開銷。 – tieleman
這是偉大的建議!調查jbuilder,它似乎可能適用於我。對我來說唯一的麻煩是一旦我渴望加載一個對象,我真的需要所有的數據嵌套密集數組。但即使在加載之後,似乎當我嘗試構建自己的數組時,它會重新運行查詢並導致很大的延遲。這就是爲什麼要使用.to_json方法。 jbuilder能解決這個問題嗎?這意味着,它是否會以一種讓我無法重新運行查詢的方式與熱切加載的模型進行交互? –