Rails 3限制包含的对象

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

看起来你不能在为多个记录加载关联时对:has_many应用限制:has_many

例:

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

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

 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 

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

 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) 

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

编辑:

看看Rails文档证实了这一点。 你总能找到这些东西,一旦你弄明白它们:)

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

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

 class Blog < ActiveRecord::Base has_many :included_posts, :class_name => 'Post', :limit => 10 has_many :posts end 

那么你可以这样做:

 $ Blog.first.included_posts.count => 10 $ Blog.first.posts.count => 999