Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.0k views
in Technique[技术] by (71.8m points)

ruby on rails - limit the number of objects returned in a has_many

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.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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!


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...