Rails 3限制包含的对象

lon*_*gie 16 activerecord ruby-on-rails eager-loading ruby-on-rails-3

例如,我有一个博客对象,该博客有很多帖子.我想做第一个博客对象的热切加载,并包括说出它的前10个帖子.目前我会做@blogs = Blog.limit(4),然后在视图中使用@blogs.posts.limit(10).我很确定有一种更好的方法可以通过包括诸如此类的包含来实现Blog.include(:posts).limit(:posts=>10).是不是可以限制包含的对象的数量,还是我错过了一些基本的东西?

Thi*_*ilo 10

看起来您不能:has_many对多个记录的热切加载关联应用限制.

例:

class Blog < ActiveRecord::Base
  has_many :posts, :limit => 5
end

class Post < ActiveRecord::Base
  belongs_to :blog
end
Run Code Online (Sandbox Code Playgroud)

这适用于限制单个博客的帖子数量:

ruby-1.9.2-p290 :010 > Blog.first.posts
  Blog Load (0.5ms)  SELECT `blogs`.* FROM `blogs` LIMIT 1
  Post Load (0.6ms)  SELECT `posts`.* FROM `posts` WHERE `posts`.`blog_id` = 1 LIMIT 5
Run Code Online (Sandbox Code Playgroud)

但是,如果您尝试加载所有博客并急切加载帖子:

ruby-1.9.2-p290 :011 > Blog.includes(:posts)
  Blog Load (0.5ms)  SELECT `blogs`.* FROM `blogs` 
  Post Load (1.1ms)  SELECT `posts`.* FROM `posts` WHERE `posts`.`blog_id` IN (1, 2)
Run Code Online (Sandbox Code Playgroud)

请注意,第二个查询没有限制,并且不可能 - 它会限制所有博客中返回到5的帖子数量,这根本不是您想要的.

编辑:

看看Rails文档证实了这一点.你总能找到这些东西,一旦你想出来:)

如果您急切地使用指定的:limit选项加载关联,它将被忽略,返回所有关联的对象

  • 对于Rails 4:has_many:posts, - > {limit 5} (3认同)

the*_*gah 2

您需要限制博客模型中的帖子数量,如下所示:

class Blog < ActiveRecord::Base
    has_many :included_posts, :class_name => 'Post', :limit => 10
    has_many :posts
end
Run Code Online (Sandbox Code Playgroud)

那么你可以这样做:

$ Blog.first.included_posts.count
=> 10
$ Blog.first.posts.count 
=> 999
Run Code Online (Sandbox Code Playgroud)