限制has_many中返回的对象数

时间:2011-05-20 18:50:26

标签: ruby-on-rails activerecord limit has-many

如何限制多个关系中返回的行数?例如:

class User < ActiveRecord::Base
  has_many :photos
end

我希望能够做到:

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

这显然不起作用,但具有此功能的东西。我是否需要自己编写SQL?

提前致谢!

编辑: 我不想限制关联,只是查询结果。所以一个用户可能有一千张照片,我只想要返回前三名。

3 个答案:

答案 0 :(得分:10)

您不必对模型中的限制进行硬编码。你可以致电@user.photos.limit(8)。您还可以调用@user.photos.scoped来获取延迟加载的范围对象。从@user.photos返回的东西可能看起来非常非常像Array,但它不是 - 它对你而言!

请参阅http://apidock.com/rails/ActiveRecord/Associations/CollectionProxy进行兔子洞的有趣之旅 - 您回来的事情是委派几乎所有标准物体检查电话(classsingleton_class,{{1 }},methods等)到method对象,但它将一组调用委托给Array对象。这就是为什么如果你打电话给ActiveRecord::Associations::*它会告诉你它正在使用@user.photos.method(:<<),但实际上并没有使用它 - 它正在使用#<Method: Array#<<>中的那个!

答案 1 :(得分:2)

您可以在实际的:limit声明中添加has_many

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

答案 2 :(得分: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协会中将'class'更改为'class_name'