在诊断 N+1 查询问题时,我注意到 ActiveRecord has_one/has_many :through 链接在一起时的关联忽略了包含。
示例代码(我的案例是我们的模型):
class Post < ActiveRecord::Base
has_one :user
has_one :badge, through: :user
end
class User < ActiveRecord::Base
has_one :badge
end
class Badge < ActiveRecord::Base
end
遍历关联不会执行除包含之外的其他查询
post = Post.include(:user => :badge)
post.user.badge
但试图通过:
post = Post.include(:user => :badge)
post.badge
进行另一个 LIMIT 1 查询。这将导致 N+1 在循环中。
为了解决这个问题,我想用代表替换所有 has_one/many :through。has_many/one :through 选项有什么优势(在没有条件的情况下)?