Hi all,

A short while ago some of us were wondering on rails-contrib/here  
about the feasibility of Base.find returning a proxy object and cool  
things that we could do with that. I've been toying with a small  
plugin that adds some of that stuff. It's now in a state where it  
might be fun for people to play with (Rails' unit tests basically past  
with this plugin loaded. There are a few failures, but nothing super  
interesting)

What there's right now:

posts = Post.find :all
posts.load :comments => :author #preloads the comments association and  
the author from comments. Same syntax as your normal :include/ :joins  
conditions

posts.comments.first #=> triggers an eager load of comments on all posts

posts.comments.first.author #=> triggers an eager load of the author  
of all comments

Of the quirks I am aware of/anticipate the biggest cause is the fact  
that in some cases eager loading a collection behaves slightly  
differently to loading it normally. (for example :order on has many  
through is a bit off). With this plugin installed basically every  
association load is an eager load so no hiding from any of those issues.

There are interesting questions around garbage collection: because  
each record references the collection it was part of, keeping one of  
them around keeps them all around. Playing with WeakRef is a  
possibility (but right now that would actually break some of the  
functionality). Detaching all objects with each request cycle is  
another as is figuring what patterns indicate that the user probably  
does want to detach the record and do that automatically. I feel that  
picking one of the options right now would be premature.

Caveats/Gotchas/etc:
- Requires Rails 2.1
- Anything before 
http://github.com/rails/rails/commit/b7a37b742c0abd1df8ea48cc82f76385cc0c41ea 
  (sometime last week) will die horribly if you try and load a has_one  
through (because preload of has_one :through is borked before that).
- has_many associations with a :limit option are excluded because they  
can't be eager loaded nicely.
- has_many :through with options/conditions on the join table will  
probably be screwed up:

has_many :foos, :conditions => ...
has_many :bars, :through => :foos, :conditions => something only on bars

should be ok

has_many :foos
has_many :bars, :through => :foos, :conditions => something on foos

probably won't work

Code:
http://github.com/fcheung/ar_result_set/tree

I'm at railsconf so grab me/ smack me on the face if you feel so  
inclined

Fred

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Core" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-core?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to