2011-07-16 33 views
16

例如,我有一個博客對象,並且該博客有許多帖子。我想做第一個博客對象的急切加載,幷包括它的前10個帖子。目前我會做@blogs = Blog.limit(4),然後在視圖中使用@blogs.posts.limit(10)。我很確定有一個更好的方法可以通過包括Blog.include(:posts).limit(:posts=>10)在內的方式來實現。是不是可以限制包含的對象的數量,還是我缺少一些基本的東西?Rails 3限制對象

+0

看到http://stackoverflow.com/questions/6076392/limit-the-number-of-objects-returned-in-a-has-many – Thilo

+0

奇怪的是,我甚至不能在Rails中使用這種方法(3.1 ) 安慰。添加'has_many:recent_posts,:class_name =>'發佈',::限制=> 3'。但是,當我做'Blog.includes(:posts).first'我仍然得到所有帖子不只是第一個3. – loneaggie

+0

嘗試Blog.includes(:recent_posts).first.recent_posts – Thilo

回答

2

您需要限制的職位數在您的博客模式是這樣的:

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 
+0

但是這不會限制每個博客的帖子總數嗎? – loneaggie

+0

沒錯,但是你可以創建多個關聯。看代碼。 – s84

+0

我看到這是如何工作的,但是是否有可能在查詢中獲取博客對象? '@blogs = Blog.limit(3).recent_posts'實際上給了我一個帖子數組,但不是最初的父Blog。我試圖優化我的數據庫/查詢用法,如果這是有道理的。 – loneaggie

10

看起來就像你不能限制適用於:has_many當渴望加載多個記錄的關聯時。

例子:

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

class Post < ActiveRecord::Base 
    belongs_to :blog 
end 

此限制的職位數爲單個博客工作正常:

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 

但是,如果你嘗試加載的所有博客和渴望負載與他們的職位:

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,這完全不是你想要的。

編輯:

一看Rails docs證實了這一點。你總能找到這些東西你想通出來:)分鐘

如果你渴望負載與指定的關聯:限制選項,它 會被忽略,返回所有關聯的對象

+3

For Rails 4:has_many:posts, - > {limit 5} – quatermain