hb9*_*922 10 activerecord ruby-on-rails limit has-many
如何限制多个关系中返回的行数?例如:
class User < ActiveRecord::Base
has_many :photos
end
Run Code Online (Sandbox Code Playgroud)
我希望能够做到:
User.includes(:photos => {:limit => 8}).all
Run Code Online (Sandbox Code Playgroud)
这显然不起作用,但具有此功能的东西.我是否需要自己编写SQL?
提前致谢!
编辑:我不想限制关联,只是查询结果.所以用户可能有一千张照片,我只想要返回前三名.
tov*_*ett 12
您不必对模型中的限制进行硬编码.你可以打电话@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!
只需向 has_many 关联添加一个 limit 选项即可:
class User < ActiveRecord::Base
has_many :photos, :limit => 8
end
Run Code Online (Sandbox Code Playgroud)
编辑
根据您的需求:
class User < ActiveRecord::Base
has_many :all_photos, :class_name => "Photo"
has_many :photos, :limit => 8
end
Run Code Online (Sandbox Code Playgroud)
注意:将 all_photos 关联中的“class”更改为“class_name”