如何限制多关系中返回的行数?例如:限制在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