2

我是比較新的軌道。我明白,rails可以讓你輕鬆地使用數據庫值,但是我對盲目使用哪種方法在數據庫上更節能,哪些方法不是更加節能。Rails的最小化數據庫裝載

這是一個很好的例子。我有一個belongs_to用戶的模型約會。在我的語法中,我有時可以說process_user @appointment.user當我編寫它時,它是否對數據庫運行單獨的SELECT查詢以檢索該用戶?它是更有效的寫process_user @appointment.user_id其中user_id是在約會的屬性,然後嘗試使用user_id的值,只要執行我的評價相關的任務,因爲我並不需要整個用戶對象@appointment.user

坦率地說,從心態平和的角度來看,我只是喜歡能夠使用process_user @appointment.user,因爲它更好看,看起來更好,在準備邏輯時效果更好。這是一種性能高效的方式嗎?

+0

如果您是新的軌道不開始讓自己在糾結了效率。 Rails並不是最快或者最有效的框架,但是它的好處是它很容易使用併爲你做了很多工作。如果你需要優化,那麼稍後再做。 – thomasfedb

回答

1

您是使用像process_user @appointment.user代碼完全正常,因爲ActiveRecord的會盡可能減少數據庫查詢的次數。當然,它並不能完美地處理所有的情況,但你的例子是一個非常基本的例子。可能不會立即發生數據庫查詢,只有在訪問其屬性時纔會加載該對象。

如果您發現在運行大型應用程序性能問題,你可以跟蹤下來的問題用分析的ActiveRecord來,它可能是時間來優化。試圖從一開始就進行預優化將違反Rails的理念,並且只會導致醜陋(甚至可能更慢)的代碼。請記住,真正的性能瓶頸往往出現在你永遠無法期待的地方。

編輯:正如溫菲爾德指出的那樣,優化查詢次數通常並不意味着自己管理外鍵或類似的內部事件。數據庫訪問方法有許多標誌和選項,可以讓你控制數據庫的查詢方式。

1

您可以用熱切您的預約模型加載您的相關用戶:

Appointment.all(:include => :user) 

...這將在用戶加入或者在單個查詢所有相關的用戶做一個單獨的查詢。

然後,它會提前(急切地)加載用戶關聯,以便在引用它時用戶屬性已經被對象填充,而不必停止並執行單獨的查詢以逐個查找(N +1查詢)。