Ruby on rails Rails 4急切负载限制子查询

Ruby on rails Rails 4急切负载限制子查询,ruby-on-rails,ruby-on-rails-4,eager-loading,Ruby On Rails,Ruby On Rails 4,Eager Loading,当急于加载并对子查询应用限制时,有没有办法避免n+1问题? 我希望避免大量类似以下内容的sql查询: Category.all.each do |category| category.posts.limit(10) end 但我也希望每个类别只获得10篇文章,因此获得所有文章的标准急切加载是不够的: Category.includes(:posts).all 解决这个问题的最好办法是什么?N+1是限制每个类别的帖子数量的唯一方法吗?来自 如果使用指定的:limit选项加载关联,将忽略该关

当急于加载并对子查询应用限制时,有没有办法避免n+1问题? 我希望避免大量类似以下内容的sql查询:

Category.all.each do |category|
  category.posts.limit(10)
end
但我也希望每个类别只获得10篇文章,因此获得所有文章的标准急切加载是不够的:

Category.includes(:posts).all
解决这个问题的最好办法是什么?N+1是限制每个类别的帖子数量的唯一方法吗?

来自

如果使用指定的:limit选项加载关联,将忽略该关联,并返回所有关联对象

所以给出了下面的模型定义

class Category < ActiveRecord::Base
  has_many :posts
  has_many :included_posts, -> { limit 10 }, class_name: "Post"
end
如果您将
LIMIT
子句添加到posts查询中,它将返回总共10篇posts,而不是您所期望的每个类别10篇posts

回到你的问题上来,我希望加载所有帖子,然后使用
first(10)

尽管您正在将更多的模型加载到内存中,但这肯定会更有效,因为您只需要对数据库进行2次调用,而不是n+1次调用。干杯

Category.includes(:posts).all

Category Load (0.2ms)  SELECT "categories".* FROM "categories"
Post Load (0.4ms)  SELECT "posts".* FROM "posts" WHERE "posts"."category_id" IN (1, 2, 3)
categories = Category.includes(:posts).all
categories.first.posts.first(10)