当你渴望负载相关的记录使用.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")
就像一个建议,可以请你分享你的日志吗? –