2011-05-20 37 views
9

如何限制多關係中返回的行數?例如:限制在has_many中返回的對象數

class User < ActiveRecord::Base 
    has_many :photos 
end 

我希望能夠做到:

User.includes(:photos => {:limit => 8}).all 

這顯然不工作的事,但這個功能。我需要自己寫出SQL嗎?

在此先感謝!

編輯: 我不想限制關聯,只是查詢結果。所以一個用戶可能有一千張照片,我只希望返回前三名。

回答

2

只是限制選項添加到的has_many協會:

class User < ActiveRecord::Base 
    has_many :photos, :limit => 8 
end 

編輯

根據您的需求:

class User < ActiveRecord::Base 
    has_many :all_photos, :class_name => "Photo" 
    has_many :photos, :limit => 8 
end 

注:改變 '階級'到all_photos associa中的'class_name'和

+0

我不想限制關聯,只查詢返回的行... – hb922 2011-05-20 18:57:05

+0

它限制返回的行。不過,您可以從has_many關聯 - >「@ user.photos [0..7]」 – ronnieonrails 2011-05-20 19:01:35

+0

中選擇8個最重要的結果,我希望能夠使用預先加載來完成此操作,這樣我可以提取1000條記錄只有每個模型中的前3個關聯... – hb922 2011-05-20 20:45:44

2

您可以將:limit放置在實際的has_many聲明中。

class User < ActiveRecord::Base 
    has_many :photos, :limit => 8 
end 
+4

如何在每個查詢的基礎上而不是在模型上執行此操作? – hb922 2011-05-20 18:56:39

9

您不必硬編碼模型中的限制。你可以撥打@user.photos.limit(8)。您也可以撥打@user.photos.scoped來獲取延遲加載的範圍對象。從@user.photos返回的東西可能看起來非常非常像Array,但它不是 - 它對你而言!

了一次有趣的旅行變成了兔子洞見http://apidock.com/rails/ActiveRecord/Associations/CollectionProxy - 你回來的東西是相當委託太多所有標準的對象檢查電話(classsingleton_classmethodsmethod等)的一個Array對象,但它的將一組調用委託給一個ActiveRecord::Associations::*對象。這就是爲什麼如果你打電話給@user.photos.method(:<<)它會告訴你它使用的是#<Method: Array#<<>,但它實際上並沒有使用它 - 它使用的是ActiveRecord::Associations::CollectionProxy中的那個!