How can I limit the number of rows returned in a has many relationship? For example:
class User < ActiveRecord::Base
has_many :photos
end
I want to be able to do:
User.includes(:photos => {:limit => 8}).all
This obviously doesnt work, but something with this functionality. Do I need to write out the SQL myself?
Thanks in advance!
EDIT: I dont want to limit the association, just the query results. So a User might have a thousand photos, I only want the top 3 returned.
You don't have to hard code the limit in the model. You can call @user.photos.limit(8)
. You can also call @user.photos.scoped
to get a scope object that does lazy loading. The thing returned from @user.photos
may look very, very much like an Array
, but it's not - it lies to you!
See http://apidock.com/rails/ActiveRecord/Associations/CollectionProxy for an interesting trip into the rabbit hole - the thing you get back is delegating pretty much all of the standard object inspection calls (class
, singleton_class
, methods
, method
, etc.) to an Array
object, but it's delegating a certain set of calls to an ActiveRecord::Associations::*
object. That's why if you call @user.photos.method(:<<)
it will tell you it's using #<Method: Array#<<>
, but it's not actually using that - it's using the one in ActiveRecord::Associations::CollectionProxy
!
Just add a limit option to the has_many association:
class User < ActiveRecord::Base
has_many :photos, :limit => 8
end
EDIT
According to your needs:
class User < ActiveRecord::Base
has_many :all_photos, :class_name => "Photo"
has_many :photos, :limit => 8
end
note: changed 'class' to 'class_name' in the all_photos association
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With