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选项加载关联,它将被忽略,返回所有关联的对象
您需要限制博客模型中的帖子数量,如下所示:
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)
| 归档时间: |
|
| 查看次数: |
4246 次 |
| 最近记录: |