【问题标题】:limit the number of objects returned in a has_many限制 has_many 中返回的对象数量
【发布时间】:2011-05-20 18:50:26
【问题描述】:

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

class User < ActiveRecord::Base
  has_many :photos
end

我希望能够做到:

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

这显然不起作用,但具有此功能。需要我自己写出SQL吗?

提前致谢!

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

【问题讨论】:

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


    【解决方案1】:

    您不必对模型中的限制进行硬编码。您可以拨打@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(:&lt;&lt;),它会告诉你它正在使用#&lt;Method: Array#&lt;&lt;&gt;,但它实际上并没有使用它——它正在使用ActiveRecord::Associations::CollectionProxy中的那个!

    【讨论】:

      【解决方案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'

      【讨论】:

      • 它确实限制了返回的行。但是,您可以从 has_many 关联中选择前 8 个结果 -> "@user.photos[0..7]"
      • 我希望能够使用预加载来做到这一点,这样我就可以提取前 1000 条记录,每个模型中只有前 3 个关联...
      • 所以你应该创建两个关联。一个用于整个系列,另一个用于有限系列。我编辑了我的答案。
      • 这不适用于急切加载,请参阅stackoverflow.com/a/6722104/217956
      【解决方案3】:

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

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

      【讨论】:

      • 如何在每个查询而不是模型上执行此操作?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-07
      相关资源
      最近更新 更多