我正在運行Ruby on Rails 3.1。我閱讀下面的文章和文檔有關預先加載,我想找個做的事情正確的方法:渴望加載:正確的做事方式
- Eager Loading Associations【官方文檔】
- ActiveRecord::Associations::ClassMethods(請參見「聯想的預先加載」 )【官方文檔】
- Eager loading [博客文章]
的#2說:
注意使用條件像Post.includes([:作者:評論])。其中([ '?comments.approved =',真])所有可以產生意想不到的後果。
的#3說,這些意想不到的後果是:(注:例子是很相同的,所以我引用的博客文章的確切內容,但你必須記住具體的解決辦法,而不是執行):
這個查詢,因爲它會使用一個LEFT JOIN,所以也會放棄所有沒有任何評論的單詞「first」的評論。
也就是說,如果存在非「關聯」對象,則「主關聯」對象將不會被加載。當我嘗試使用加入一些條件像.where(:category_relationships => {:user_id => @current_user.id})
在我的previous question時,會發生這種情況,但我不希望發生這種情況。
所以(失敗主義者,因爲我可能不能在我的情況下條件不能在has_many
語句設置使用預先加載 - 請注意,在上面的代碼@current_user.id
是存在於例子「動態設置」不像我想知道是否有pratiques /技術/戰略,以限制數據庫查詢,因爲我有一個「N + 1問題」。
也許這些pratiques /技術/策略是通過使用Ruby on Rails框架的所有可執行...的#1說:
即使活動記錄可以讓你在渴望 指定條件像加入一樣加載關聯,推薦的方法是使用 連接。
什麼和如何解決這個問題的正確方法?
可能的解決方案是檢索和建立自己需要運行特定分離數據庫查詢裝載什麼,但隨後的問題就如何「通」 /「副」 /「插值」那些將「關聯」對象檢索到「主要關聯」對象,以便那些可以使用「一種渴望加載」的方式?也就是說,如何使可能(請參閱mentioned question獲取更多信息)使用類似@article.comments
之類的代碼,並只獲得我渴望加載自己的評論? 我的渴望加載,是否可能/正確使類似@article.comments = my_eager_loaded_comments
這樣「傳遞」/「關聯」/「插值」評論文章?
因爲在我的情況下,我不能使用'has_many'關聯,因爲在我的情況下,我應該說''has_many,:conditions => ['user_id =?',@ current_user.id]'(*這是不可能的!* ...當然是我的知識)。因此,我想知道有關急切加載功能的解決方案。 – Backo 2012-03-12 23:54:04