當你渴望負載相關的記錄使用.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")
就像一個建議,可以請你分享你的日誌嗎? –