在我的應用程序中,我有一個複雜的數據庫結構。爲了爲一個調用生成JSON響應,我需要從許多連接的表中獲取數據。如何避免再次調用數據庫當我已經擁有全部需要的SQL調用結果時
我創建了一個SQL查詢,獲取我需要的所有數據(使用rails'includes
)。然而,現在我認爲我的結果是,我無法弄清楚什麼是實際呈現它的正確方法。
一個簡單的例子,不是我的實際代碼:比方說,我有項目包含子項目包含任務和查詢返回他們所有的一些嵌套結構,根據一些過濾邏輯。
class Project < ActiveRecord::Base
...
def with_sub_projects_visible_by(user)
includes(...complex join with sub projects and tasks...)
.where(...complex condition...)
end
end
在控制器我有這樣的事情:
def show
@project_with_full_details = Project.find(params[:id]).with_sub_projects_visible_by(current_user)
end
有沒有寫,這將使得包含從@project_with_full_details
的所有數據,而無需再次調用數據庫中的頁面簡潔視圖代碼的方法嗎?從我的嘗試中,只需撥打@project_with_full_details.sub_projects
並不能解決問題。它調用數據庫並獲取相關子項目的完整列表,而不是應該包含在查詢結果中的已過濾列表。
(我使用Rabl的對我的看法,因爲我渲染JSON,但它是那麼重要,ERB例如將完全罰款)
只是在執行'includes(:tasks)'應該爲您做好急切的加載並且只做一個連接查詢來獲取對象和相關的任務關聯。 '包括(...複雜的加入子項目和任務...)'不會最大限度地發揮作用,如果你想用自定義查詢做一個非常複雜的連接,你需要'join()'方法 – VelLes