2

爲了()子句的工作預先加載我使用這個查詢來獲取我的數據不與軌道

user = User.includes(:skills).order(user: :id) 

它工作正常。但是當我嘗試顯示由字母順序排列的技能,如下面

user.skills.order(name: :asc) 

它顯示了日誌,它去在數據庫中order()activerecord方法。看來eager loading在這裏是失敗的,因爲無論如何它必須進入數據庫,使用急切加載的意義何在。

任何人都可以引導我什麼是一個很好的方法來做到這一點。

+0

就像一個建議,可以請你分享你的日誌嗎? –

回答

1

當你渴望負載相關的記錄使用.includes,你應該是訪問的關聯。否則,如果添加更多查詢條件,則會導致新的數據庫查詢。

有幾種方法可以訂購相關的預先加載的記錄。

1.添加訂單條件到關聯。

在這種情況下,只要您訪問關聯,關聯的記錄將始終按名稱排序。

class User < ActiveRecord::Base 
    has_many :skills, -> { order(:name) } 
end 

2.用於使用在此特定情況下創建具有適當的順序另一個關聯。

這對於避免skills關聯中的不必要條件很有用。

class User < ActiveRecord::Base 
    has_many :skills_ordered_by_name, -> { order(:name) }, class_name: "Skill" 
end 

# usage 
users = User.includes(:skills_ordered_by_name) 

users.each do |user| 
    # access eager loaded association 
    user.skills_ordered_by_name 
end 

3.設置默認順序爲Skill模型。

這將導致條件不僅適用於關聯,還適用於Skill模型。

class Skill < ActiveRecord::Base 
    default_scope { order(:name) } 
end 

4.排序渴望加載記錄使用Ruby代碼(不是ActiveRecord的查詢方法)

時不會有太多的記錄進行排序這種做法是合適的。

users = User.includes(:skills) 

users.each do |user| 
    # sorting with Ruby's 'sort_by' method 
    user.skills.sort_by(&:name) 

    # or something like 
    user.skills.sort { |one, another| one.name <=> another.name } 
end 

5.使用eager_load方法,並添加關聯順序條件主要查詢

在這種情況下,它不會像include工作方法通常工作,使兩個查詢。一個查詢將使用'LEFT OUTER JOIN'來獲取相關記錄。

users = User.eager_load(:skills).order("users.id, skills.name") 
+0

感謝您的詳細解答。但除了eager_load沒有任何工作。爲什麼 – ImranNaqvi

+0

一切都應該工作。是什麼讓你覺得有些東西不起作用:錯誤,額外的數據庫查詢,錯誤的順序或其他什麼? – chumakoff

+0

沒有錯誤,但對結果沒有影響。我實現了這些全部檢查差異 – ImranNaqvi

0

您可以使用此:

user = User.includes(:skills).order(user: :id, name: :desc)