2011-05-20 31 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中的那个!