如何限制多關係中返回的行數?例如:限制在has_many中返回的對象數
class User < ActiveRecord::Base
has_many :photos
end
我希望能夠做到:
User.includes(:photos => {:limit => 8}).all
這顯然不工作的事,但這個功能。我需要自己寫出SQL嗎?
在此先感謝!
編輯: 我不想限制關聯,只是查詢結果。所以一個用戶可能有一千張照片,我只希望返回前三名。
如何限制多關係中返回的行數?例如:限制在has_many中返回的對象數
class User < ActiveRecord::Base
has_many :photos
end
我希望能夠做到:
User.includes(:photos => {:limit => 8}).all
這顯然不工作的事,但這個功能。我需要自己寫出SQL嗎?
在此先感謝!
編輯: 我不想限制關聯,只是查詢結果。所以一個用戶可能有一千張照片,我只希望返回前三名。
只是限制選項添加到的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'和
您可以將:limit
放置在實際的has_many
聲明中。
class User < ActiveRecord::Base
has_many :photos, :limit => 8
end
如何在每個查詢的基礎上而不是在模型上執行此操作? – hb922 2011-05-20 18:56:39
您不必硬編碼模型中的限制。你可以撥打@user.photos.limit(8)
。您也可以撥打@user.photos.scoped
來獲取延遲加載的範圍對象。從@user.photos
返回的東西可能看起來非常非常像Array
,但它不是 - 它對你而言!
了一次有趣的旅行變成了兔子洞見http://apidock.com/rails/ActiveRecord/Associations/CollectionProxy - 你回來的東西是相當委託太多所有標準的對象檢查電話(class
,singleton_class
,methods
,method
等)的一個Array
對象,但它的將一組調用委託給一個ActiveRecord::Associations::*
對象。這就是爲什麼如果你打電話給@user.photos.method(:<<)
它會告訴你它使用的是#<Method: Array#<<>
,但它實際上並沒有使用它 - 它使用的是ActiveRecord::Associations::CollectionProxy
中的那個!
我不想限制關聯,只查詢返回的行... – hb922 2011-05-20 18:57:05
它限制返回的行。不過,您可以從has_many關聯 - >「@ user.photos [0..7]」 – ronnieonrails 2011-05-20 19:01:35
中選擇8個最重要的結果,我希望能夠使用預先加載來完成此操作,這樣我可以提取1000條記錄只有每個模型中的前3個關聯... – hb922 2011-05-20 20:45:44